[英]Print prime numbers in a range of given numbers
我正在嘗試將所有素數打印到給定數字范圍內(低和最大,包括給定數字)。
例如:
num1 = 10,num2 = 20
>>> 11, 13, 17, 19
我的代碼在某些情況下會失敗,並且我不明白為什么:
num1 = int(input('First number is: '))
num2 = int(input('Second number is: '))
if num2 <= num1:
num1,num2 = num2,num1
for i in range(num1, num2+1):
for p in range(2,int(num2**0.5)+1):
if i%p == 0:
break
else:
print(i,' ',end = '')
print('\n')
結果:
1至7 >>> 1 3 5 7(省略2)
1至30 >>> 1 7 11 13 17 19 23 29(省略2,3,5)
1至60 >>> 1 7 11 13 17 19 23 29(省略2,3,5,7)
0到0 >>> 0(打印0->不是素數)
0至7 >>> 1 3 5 7(省略2)
我該如何糾正? 謝謝一群!
PS。 1號也不是素數。
您代碼中的錯誤是內部for循環范圍的第二部分中沒有i
,而不是num2
num1 = int(input('First number is: '))
num2 = int(input('Second number is: '))
if num2 > num1:
num1, num2 = num2, num1
for i in range(num1, num2+1):
if i == 0 or i == 1: continue
for p in range(2,int(i**0.5)+1): # the second part should be int(i**0.5) + 1, not int(num2**0.5)+1
if i%p == 0:
break
else:
print(i,' ',end = '')
同樣,您也可以執行以下類似操作,而不是為num1 <num2和兩個分支創建兩個分支。 在代碼設計方面,最好將其稍微分解為is_prime
方法。 這樣,如果您想編寫一個更快的素數測試器,則可以輕松地編輯helper函數,而不必弄亂主代碼。
def is_prime(num):
if i == 1: return False
for p in range(2,int(num**0.5)+1):
if num % p == 0:
return False
return True
inp1 = int(input('First number is: '))
inp2 = int(input('Second number is: '))
num1 = min(inp1, inp2)
num2 = max(inp1, inp2)
for i in range(num1, num2+1):
if is_prime(i):
print(i,' ',end = '')
print('\n')
您沒有考慮將數字除以數字本身。 即,當范圍是1到30時,sqrt(30)+1 = 5 + 1 = 6,所有6以下的數字都有被它們自己除以2%2,3%3 ... i%i的情況。
解決方法是將內部for循環的范圍更改為:
for i in range(num1, num2+1):
for p in range(2,int(i**0.5)+1): #Change num2 to i to avoid i%i
if i%p == 0:
break
else:
print(i,' ',end = '')
最好像gowrath那樣將代碼抽象化以避免錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.