#41644: python 實在是想不到還能怎樣改了


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 不指定學校
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2024-11-21 19:18:13
a121. 質數又來囉 | From: [123.192.228.253] | 發表日期 : 2024-08-14 00:36

我不想抄答案......

用篩法建表、取6n加減1的值的方法都用了

試了好幾個版本,不是TLE就是WA

如果有出WA,理由都一樣,都是說我輸出的值為0,可是自己測試的時候就沒有這種事情,題目也沒說當a,b等於多少時會這樣,不知道該從哪開始找問題。

除了兩數相等或是太近,沒有找到其他會輸出0的狀況,但這兩種情況本來就應該是0,沒有疑問,可我是不該為0時卻輸出0,就不知道是什麼數字組合會出現這情況了......我測試好多組數據,就是找不到這個可能性

感覺有什麼地方做錯了,但就是不知道哪裡有錯

 

我的思路:

先建質數表,然後直接查,在質數表外面的就直接用質數表裡面的質數去除,能整除的是合數

一個合數必定會被某個質數整除,所以只要除質數就好,質數從質數表裡面拿

若某數字n為合數,則必定有至少一個小於根號n的質因數

除了2和3外,質數必定在6n+1或6n-1之中

 

下面這是WA的解,但我不知道為什麼WA,不明白什麼情況會WA

# 檢查大於10000的數是否為質數
def check_prime(num):
    num_sqrt = int(num ** 0.5) + 1
    for prime in primes:
        if prime > num_sqrt:
            return 1
        elif num % prime == 0:
            return 0

# 建立質數表
is_prime = [True] * (10000)
primes = []
for i in range(2, 10000):
    if is_prime[i]:
        primes.append(i)
        for j in range(i * i, 10000, i):
            is_prime[j] = False
 
while True:
    try:
        a, b = map(int, input().split())
       
        result = 0
        if b <= 10000:
            for prime in primes:
                if a <= prime <= b:
                    result += 1
                elif prime > b:
                    break

        elif a <= 10000:
            a1 = a + (7 - a % 6) % 6
            a2 = a + 5 - a % 6
            result += sum(1 for num in range(a1, 10000, 6) if num in primes)
            result += sum(1 for num in range(a2, 10000, 6) if num in primes)
            result += sum(1 for num in range(10003, b + 1, 6) if check_prime(num))
            result += sum(1 for num in range(10001, b + 1, 6) if check_prime(num))

        else:
            a1 = a + (7 - a % 6) % 6
            a2 = a + 5 - a % 6
            result += sum(1 for num in range(a1, b + 1, 6) if check_prime(num))
            result += sum(1 for num in range(a2, b + 1, 6) if check_prime(num))

        print(result)
    except EOFError:
        break

 

 

 
#41667: Re: python 實在是想不到還能怎樣改了


wubaie (小億)

學校 : 不指定學校
編號 : 123253
來源 : [163.30.29.80]
最後登入時間 :
2024-11-20 16:55:50
a121. 質數又來囉 | From: [111.240.26.27] | 發表日期 : 2024-08-15 23:21

我不想抄答案......

用篩法建表、取6n加減1的值的方法都用了

試了好幾個版本,不是TLE就是WA

如果有出WA,理由都一樣,都是說我輸出的值為0,可是自己測試的時候就沒有這種事情,題目也沒說當a,b等於多少時會這樣,不知道該從哪開始找問題。

除了兩數相等或是太近,沒有找到其他會輸出0的狀況,但這兩種情況本來就應該是0,沒有疑問,可我是不該為0時卻輸出0,就不知道是什麼數字組合會出現這情況了......我測試好多組數據,就是找不到這個可能性

感覺有什麼地方做錯了,但就是不知道哪裡有錯

 

我的思路:

先建質數表,然後直接查,在質數表外面的就直接用質數表裡面的質數去除,能整除的是合數

一個合數必定會被某個質數整除,所以只要除質數就好,質數從質數表裡面拿

若某數字n為合數,則必定有至少一個小於根號n的質因數

除了2和3外,質數必定在6n+1或6n-1之中

 

下面這是WA的解,但我不知道為什麼WA,不明白什麼情況會WA

# 檢查大於10000的數是否為質數
def check_prime(num):
    num_sqrt = int(num ** 0.5) + 1
    for prime in primes:
        if prime > num_sqrt:
            return 1
        elif num % prime == 0:
            return 0

# 建立質數表
is_prime = [True] * (10000)
primes = []
for i in range(2, 10000):
    if is_prime[i]:
        primes.append(i)
        for j in range(i * i, 10000, i):
            is_prime[j] = False
 
while True:
    try:
        a, b = map(int, input().split())
       
        result = 0
        if b <= 10000:
            for prime in primes:
                if a <= prime <= b:
                    result += 1
                elif prime > b:
                    break

        elif a <= 10000:
            a1 = a + (7 - a % 6) % 6
            a2 = a + 5 - a % 6
            result += sum(1 for num in range(a1, 10000, 6) if num in primes)
            result += sum(1 for num in range(a2, 10000, 6) if num in primes)
            result += sum(1 for num in range(10003, b + 1, 6) if check_prime(num))
            result += sum(1 for num in range(10001, b + 1, 6) if check_prime(num))

        else:
            a1 = a + (7 - a % 6) % 6
            a2 = a + 5 - a % 6
            result += sum(1 for num in range(a1, b + 1, 6) if check_prime(num))
            result += sum(1 for num in range(a2, b + 1, 6) if check_prime(num))

        print(result)
    except EOFError:
        break

 

 

我用下列方式建prime串列,再用此串列判斷a~b是否為質數,AC,給您參考
prime = [2,3,5]

for i in range(7,10001,2):
    flag = True
    for x in prime:
        if x*x>i: break
        if i%x==0:
            flag = False
            break
    if flag :
        prime.append(i)

 
#41670: Re: python 實在是想不到還能怎樣改了


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 不指定學校
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2024-11-21 19:18:13
a121. 質數又來囉 | From: [123.192.228.253] | 發表日期 : 2024-08-16 10:24

我不想抄答案......

用篩法建表、取6n加減1的值的方法都用了

試了好幾個版本,不是TLE就是WA

如果有出WA,理由都一樣,都是說我輸出的值為0,可是自己測試的時候就沒有這種事情,題目也沒說當a,b等於多少時會這樣,不知道該從哪開始找問題。

除了兩數相等或是太近,沒有找到其他會輸出0的狀況,但這兩種情況本來就應該是0,沒有疑問,可我是不該為0時卻輸出0,就不知道是什麼數字組合會出現這情況了......我測試好多組數據,就是找不到這個可能性

感覺有什麼地方做錯了,但就是不知道哪裡有錯

 

我的思路:

先建質數表,然後直接查,在質數表外面的就直接用質數表裡面的質數去除,能整除的是合數

一個合數必定會被某個質數整除,所以只要除質數就好,質數從質數表裡面拿

若某數字n為合數,則必定有至少一個小於根號n的質因數

除了2和3外,質數必定在6n+1或6n-1之中

 

下面這是WA的解,但我不知道為什麼WA,不明白什麼情況會WA

# 檢查大於10000的數是否為質數
def check_prime(num):
    num_sqrt = int(num ** 0.5) + 1
    for prime in primes:
        if prime > num_sqrt:
            return 1
        elif num % prime == 0:
            return 0

# 建立質數表
is_prime = [True] * (10000)
primes = []
for i in range(2, 10000):
    if is_prime[i]:
        primes.append(i)
        for j in range(i * i, 10000, i):
            is_prime[j] = False
 
while True:
    try:
        a, b = map(int, input().split())
       
        result = 0
        if b <= 10000:
            for prime in primes:
                if a <= prime <= b:
                    result += 1
                elif prime > b:
                    break

        elif a <= 10000:
            a1 = a + (7 - a % 6) % 6
            a2 = a + 5 - a % 6
            result += sum(1 for num in range(a1, 10000, 6) if num in primes)
            result += sum(1 for num in range(a2, 10000, 6) if num in primes)
            result += sum(1 for num in range(10003, b + 1, 6) if check_prime(num))
            result += sum(1 for num in range(10001, b + 1, 6) if check_prime(num))

        else:
            a1 = a + (7 - a % 6) % 6
            a2 = a + 5 - a % 6
            result += sum(1 for num in range(a1, b + 1, 6) if check_prime(num))
            result += sum(1 for num in range(a2, b + 1, 6) if check_prime(num))

        print(result)
    except EOFError:
        break

 

 

我用下列方式建prime串列,再用此串列判斷a~b是否為質數,AC,給您參考
prime = [2,3,5]

for i in range(7,10001,2):
    flag = True
    for x in prime:
        if x*x>i: break
        if i%x==0:
            flag = False
            break
    if flag :
        prime.append(i)

謝謝你,但嘗試用你的方式建質數表後依舊WA

我想應該是我後續統計質數總數的部分有問題,我再想想

 
#41683: Re: python 實在是想不到還能怎樣改了


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 不指定學校
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2024-11-21 19:18:13
a121. 質數又來囉 | From: [123.192.228.253] | 發表日期 : 2024-08-16 13:25

最後把我寫的東西全部推倒,用最樸素的方式過的,而非查表
gist連結
用到的機制只有判斷質數時取6n-1和6n+1
AC(7.1s, 3.3MB)

 

但還是不明白我查表後,統計質數總數的過程有什麼問題
明明自己測試時都能得到正確結果......

 

 
ZeroJudge Forum