为什么这个脚本在某些情况下会陷入无限循环?
Why does this script get stuck in infinite loop for some cases?
我正在重新编写旧的 python 脚本。虽然 运行 它通过了一些随机测试用例,但我注意到它会在某些情况下陷入无限循环,但对于其他情况则不会。此脚本适用于 Project Euler Problem 3(适用于问题提示,因此从未注意到随机无限循环)。这将适用于 10、19、51、600851475143。它会陷入 152 的无限循环。我没有尝试过其他的,但认为这足以引起注意 'odd'.
的测试用例
代码如下:
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()
将 n/=d
放在 if
之外(但在 while
之内)在 def largestPrime(n):
因为在你的代码中,只有当 d
大于 largest_prime
这是错误的。 n/=d
必须完成到 n % d == 0
while n % d == 0:
if d > largest_prime:
largest_prime = d
n /= d
d += 1
我正在重新编写旧的 python 脚本。虽然 运行 它通过了一些随机测试用例,但我注意到它会在某些情况下陷入无限循环,但对于其他情况则不会。此脚本适用于 Project Euler Problem 3(适用于问题提示,因此从未注意到随机无限循环)。这将适用于 10、19、51、600851475143。它会陷入 152 的无限循环。我没有尝试过其他的,但认为这足以引起注意 'odd'.
的测试用例代码如下:
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()
将 n/=d
放在 if
之外(但在 while
之内)在 def largestPrime(n):
因为在你的代码中,只有当 d
大于 largest_prime
这是错误的。 n/=d
必须完成到 n % d == 0
while n % d == 0:
if d > largest_prime:
largest_prime = d
n /= d
d += 1