2010-09-02 40 views
1

我在一臺安裝了Python 2.6的Windows XP PC上工作,我試圖解決項目歐拉問題,但是每當我執行代碼解釋器掛起。我已經通過PyScripter,IDLE和MonkeyStudio進行了調試,但它仍然無法工作,即使像15這樣的小數值。運行時崩潰的一個非常基本的Python程序

我簡直不明白爲什麼。你能幫我解決嗎?

下面的代碼:

"""Project Euler Problem 3 
Author: A""" 

num = 15 
prime = [1] 
x = long (round(num/2)) 

def ifprime (x): 
     """ Defining the function that checks if the number is prime or not"""  
     """ Checking if the passed number is prime or not""" 

     y = long(round(x/2)) 
     while y > 0: 
       if x%y == 0: 
         return False 
       y -= 1 
     return True 

while x > 0: 
    if num%x == 0: 
     if ifprime(x): 
       print "I've found a prime! " 
       print x 
       prime[len(prime):] = [x] 
     x -= 1 
+1

這不是一個無限循環? – quantumSoup 2010-09-02 17:13:37

+0

你說你試過調試過它......你找不到自己的錯在哪裏嗎? (我做了,這很明顯是怎麼回事) – Kena 2010-09-02 17:16:07

+0

我不知道爲什麼我沒有看到它。我剛剛在幾天前開始編碼。所以,這可能與它有關。 – 2010-09-02 17:22:27

回答

4

您的x - = 1語句縮進了一個等級。當NUM%x爲0

它應該是這個

X只會遞減:

while x > 0: 
    if num%x == 0: 
     if ifprime(x): 
       print "I've found a prime! " 
       print x 
       prime[len(prime):] = [x] 
    x -= 1 
4

你有一個無限循環:

x -= 1不會被調用,因爲它是num%x == 0條件,這永遠不會發生下(如x永遠不會改變它的值)。

num是15,x開始爲7.然後,num % x是1,因此條件爲假並且x不遞減 - 從而成環循環往復。

1

再說別人已經指出的那樣,你ifprime是錯誤的。您正在檢查while y > 0,當然,該測試最多爲y = 1,因此將始終返回錯誤。

並且爲了優化目的,您不必測試高達x/2,您可以測試高達sqrt(x),這已經足夠好了。

import math 

def ifprime (x): 

    y = math.ceil(math.sqrt(x)) 

    while y > 1: 
     if x % y == 0: 
      return False 
     y -= 1 

    return True 
+0

是的,我注意到跑步時我糾正了它。另一方面,如果我認爲y> 1,函數不會將2認定爲素數。所以,我必須弄清楚。 非常感謝您的優化技巧。 – 2010-09-02 17:30:02

+0

@JustA:硬編碼2爲素數,並且只能通過2和奇數> = 3檢查整除。 – Brian 2010-09-02 17:31:52

+0

@Brian:我現在感覺像是一個延遲。我有很多東西要學。 – 2010-09-02 17:50:47

0

我有dealt so much with primes,我做了補充,找到因素和使用,對於改變定義ifprime。

import math 

## I want any which return first not False value 
def some(seq): 
    for item in seq: 
     if item: 
      return item 

def factor (number): 
    """ returns smallest factor of number or None """ 
    if number < 4: return None 
    return some(divisor 
       for divisor in [2] + range(3,int(number ** 0.5)+2, 2) 
       if not(number % divisor)) 

# little slower way for fun (because factor gives the factoring it found) 
def ifprime(number): 
    return number > 1 and not factor(number) 

print [number for number in range(100) if ifprime(number)] 

(如果你需要很多的素數使用sieve algorithm,而不是主要的測試。)

相關問題