2015-04-23 80 views
-1

我正在重新編寫一箇舊的python腳本。在通過一些隨機測試案例運行它時,我注意到它會在某些情況下陷入無限循環,而不是其他情況。該腳本適用於Project Euler Problem 3(適用於問題提示,因此從未注意到隨機無限循環)。這將適用於10,19,51,600851475143.它陷入了152的無限循環。我沒有嘗試其他的,但認爲這是足夠的測試用例來注意某些「奇怪」的東西。爲什麼此腳本在某些情況下陷入無限循環?

下面的代碼:

import sys 

def largestPrime(n): 
    largest_prime = 0 # initialize largest prime 
    d = 2 # set first value for factor evaluation 

    while n > 1: # n will be divided by each factor later on 
     while n % d == 0: # check if n is divisible by factor 
      if d > largest_prime: # check if d is greater than largest_prime 
       largest_prime = d # if so, set largest_prime = d 
       n /= d # if so, can divide n by d to find remaining factors 
     d += 1 

    return largest_prime 


def main(): 
    # Make a list of command line arguments, omitting the [0] element 
    # which is the script itself. 
    args = sys.argv[1:] 
    if not args: #if list is empty; return message & exit 
     print ("Usage: euler003.py 'n'") 
     sys.exit(1) 

    if len(args) > 1: #if list less than 1; return message & exit 
     print ("You've entered too many arguments; Usage: euler001.py 'n'") 
     sys.exit(1) 

    largest = largestPrime(int(args[0])) 
    print (largest) 


# This is the standard boilerplate that calls the main() function.  
if __name__ == "__main__": 
    main() 

回答

3

廣場n/=ddef largestPrime(n):if(但while內)之外,因爲在你的代碼,你做n/=d只有當d大於largest_prime這是不對的。 n/=d必須完成,直到n % d == 0

while n % d == 0: 
    if d > largest_prime: 
     largest_prime = d 
    n /= d 
d += 1 
+0

謝謝!沒有捕捉到均勻分佈的無限循環(認爲10覆蓋了它,但沒有導致偶數)。 –

相關問題