Project Euler 10 Python



我两天前开始学习Python,我的朋友说Project Euler很好学。我解决了前9个问题,虽然很难,但每次都能奏效。但现在我被卡住了,我不知道为什么。我的答案是大约10万(在处理这些巨大的数字时似乎没有那么多(。所以,如果你们中有人有时间帮我找出我的错,我将不胜感激。

x = 2
z = 0

def is_prime(x):
if x == 2:
return True
for n in range(2, 1415):
if x % n == 0:
return False
return True

while x < 2000000:
if is_prime(x) == True:
z = z + x
x = x + 1
elif x >= 2000000:
break
else:
x = x + 1
print(z)

问题在于验证数字是素数的函数。

这里有一个工作函数:

def is_prime(x):
if (x<2):
return False
div = 2
while (div < x):
if (x%div == 0):
return False
div += 1
return True

编辑:

这里有一个更快的解决方案:

x = 2
z = 0
def is_prime2(n):
if n == 2:
return True
if n & 1 == 0:
return False
d= 3
while d * d <= n:
if n % d == 0:
return False
d= d + 2
return True

while x <= 2000000:
if is_prime2(x) == True:
z = z + x
x = x + 1
else:
x = x + 1
print(z)

is_prime函数是错误的来源,特别是

for n in range(2, 1415)

这意味着1415以下的数字都不是素数,因为例如,7是素数,但在2-1414的范围内,所以7%7是0。

保持相同的基本格式,我们可以这样重写它,使用数学计算每个数字的平方根(这就是1415的来源(。如果您不想导入数学,可以将其设置为范围(2,x(,但这将需要很长的计算时间。

def is_prime(x):
if x == 2:
return True
for n in range(2, math.ceil(math.sqrt(x))+1): # +1 is for how python handles ranges
if (x % n) == 0:
return False
return True

你也可以像这样清理你的代码(保持相同的通用格式(:

for x in range(2, 2000000+1): # again, +1 for how python handles ranges
if is_prime(x): # you don't need == True, the True return makes the if statement True
z += x
print(z)

我不能发表评论,所以我有一个问题。。。你运行了代码,发生了什么?我复制粘贴你的代码,我无法运行它。所以我有这个解决方案,如果不是运行

x = 2
z = 0

def is_prime(x):
if x == 2:
return True
for n in range(2, 1415):
if x % n == 0:
return False
return True
is_prime = is_prime(x)
while x < 2000000:
if is_prime == True:
z = z + x
x = x + 1
elif x >= 2000000:
break
else:
x = x + 1
print(z)

只有在未运行时才会执行此操作。正如那些家伙在你的评论中所说的,对你的问题要更加具体。

最新更新