簡體   English   中英

Python,得到質數的錯誤答案

[英]Python, getting wrong answers for prime numbers

我在這段代碼中得到了幾個不正確的答案。 例如,9顯示為質數。 我猜我的問題是使用中斷,但是我似乎無法從邏輯上弄清楚有人問我的這個簡單代碼有什么問題。

for number in range(0, 1000):

    for x in range(2, number):
         if (number % x == 0):
             break
         else:
             print x
             break

在您的腳本中,無論數字是否可被2整除,它都會立即中斷循環。 我已經縮進了代碼,這可能更接近於您嘗試做的事情。

在您的原始代碼中,如果數字可被2整除range(2,number)中的第一個數字range(2,number) ,則您會中斷循環;如果無法將其整除 ,也會中斷循環。因此所有奇數(如9)看起來像素數。

如果循環正常退出,則在運行for循環后運行else關鍵字。 因此,僅在找不到除數的情況下才打印“是素數”部分。

for number in range(0,1000):
    for x in range(2,number):
        if(number % x == 0):
            print number,"divisible by",x
            break
    else:
        print number, "is prime"

您可以在此處看到此禁令: http ://codepad.org/XdS413LR

同樣,這是一個幼稚的算法(不是對代碼的批評,探索簡單的算法是有用的研究),但是您可以提高效率。 從技術上講,您只需要檢查number的平方根,因為任何大於平方根的number都必須有一個小於平方根的補碼,而平方根應該已經遇到過。 因此,代碼中的邏輯可以更改為:

from math import sqrt
for number in range(0,1000):
    for x in range(2,int(sqrt(number/2))):
        # Rest of code as above.

也就是說,有很多方法可以優化對質數的檢查或發現,如果有機會,則值得進行調查。

我想你想要這樣的東西:

for number in xrange(100):
    for i in range(2,number):
        if number % i == 0:
            break
    else:
         print number

這會遍歷1-100的每個數字,並檢查除#以外的else:任何數字是否可被其他#整除,但是您需要else:在內部for循環的外面聲明語句,以便它通過內部for循環而找不到除數的質數

這里有一些選擇。 首先,這檢查素數:

def check_for_prime(n):
if n == 1: return False
elif n == 2: return True
elif n%2 == 0: return False

# Elementary prime test borrowed from oeis.org/A000040.
odds = 3
while odds < n**.5+1:
    if n%odds == 0: return False
    odds += 2
return True

這稍微快一點,但是您應該具有使用yield的經驗:

def primes_plus():
yield 2
yield 3
i = 5
while True:
    yield i
    if i % 6 == 1:
        i += 2
    i += 2

這里有一些選擇。

n是要查找的范圍內的數字

n=100
for i in range(0,n):
    num = filter(lambda y :i % y == 0,(y for y in range(2,(i/2))))
    if num or i == 4:
        print "%s not a prime number" %(i)
    else:
        print "%s is a prime number" %(i)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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