簡體   English   中英

打印給定數字范圍內的質數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM