我在安装了Python 2.6的Windows XP PC上工作,我试图解决Project Euler问题,但每当我执行代码时,解释器就会挂起。我通过PyScripter,IDLE和MonkeyStudio对它进行了调试,但它仍然不能用于像15这样的琐碎值。
我根本不明白为什么。你能帮帮我吗?
以下是代码:
"""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
答案 0 :(得分:4)
你有一个无限循环:
x -= 1
永远不会被调用,因为它在num%x == 0
条件下,从未发生过(因为x
永远不会更改其值)。
当num
为15时,x
从7开始。然后,num % x
为1,因此条件为false且x
未递减 - 因此无限循环
答案 1 :(得分: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
答案 2 :(得分:1)
除了别人指出的,你的ifprime
是错误的。您正在检查while y > 0
,当然还要检查y = 1
,因此将始终返回false。
出于优化目的,您不必测试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
答案 3 :(得分: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代替主要测试。)