我不想抄答案......
用篩法建表、取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
|
我不想抄答案......
用篩法建表、取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) + 1for prime in primes:if prime > num_sqrt:return 1elif 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] = Falsewhile True:try:a, b = map(int, input().split())result = 0if b <= 10000:for prime in primes:if a <= prime <= b:result += 1elif prime > b:break
elif a <= 10000:a1 = a + (7 - a % 6) % 6a2 = a + 5 - a % 6result += 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) % 6a2 = a + 5 - a % 6result += 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)
我不想抄答案......
用篩法建表、取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) + 1for prime in primes:if prime > num_sqrt:return 1elif 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] = Falsewhile True:try:a, b = map(int, input().split())result = 0if b <= 10000:for prime in primes:if a <= prime <= b:result += 1elif prime > b:break
elif a <= 10000:a1 = a + (7 - a % 6) % 6a2 = a + 5 - a % 6result += 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) % 6a2 = a + 5 - a % 6result += 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
我想應該是我後續統計質數總數的部分有問題,我再想想