我尝试使用Python解决欧拉计划第10题,但我的程序给出了错误的结果。由于我对Python完全不熟悉,并且在我的(显然是暴力)逻辑中找不到任何错误,所以我用Java编写了一个程序(几乎是翻译),它给出了一个不同的结果,结果证明是正确的。
以下是Python代码:
以下是Python代码:
from math import *
limit = 2000000
def isPrime(number):
if number == 2: return 1
elif number % 2 == 0: return 0
elif number == 3: return 1
elif number == 5: return 1
elif number == 7: return 1
else:
rootOfNumber = sqrt(number)
tag = 3
while tag < rootOfNumber:
if number % tag != 0:
tag += 2
else:
break ###
if tag >= rootOfNumber: ###EDIT: it should by only tag > rootOfNumber here
return 1 ### Thats what the problem was.
else:
return 0
sum = 2 # 2 is an even prime, something we are not iterating for
for i in range(3, limit, 2):
if isPrime(i) == 1:
sum += i
print(sum)
print('done...')
对应的Java代码如下:
public class Prob10{
static int limit = 2000000;
static long sum = 2L; // 2 is an even prime, something we are not iterating for
public static void main (String[] args) {
for(int i = 3; i < limit; i+=2) {
if( isPrime(i) )
sum += i;
}
System.out.println(sum);
}
private static boolean isPrime (int number) {
if (number == 2) return true;
else if (number == 3 || number == 5 || number == 7) return true;
else {
double rootOfNumber = Math.sqrt(number);
int tag = 3;
while (tag < rootOfNumber) {
if (number % tag != 0)
tag +=2;
else
break;
}
if (tag > rootOfNumber)
return true;
else
return false;
}
}
}
我认为我可能犯了一些愚蠢的错误或者错过了一些微妙的点。
p.s. 我知道我的isPrime
实现并不是很好。我没有打印输出,因为这可能会泄露问题给其他人。
欢迎对Python程序中的(糟糕)风格发表评论。
if func()
这种形式的检查,而不是if func() == 1)
。 3)使用l = [2, 3, 5, 7 ...]
,然后使用if number not in l
来以更简单的方式检查已知值。这也使您可以动态地将其他已知质数添加到列表中,如果需要的话,可以使一些可能使用isPrime(在Euler中有很多这样的算法)的算法更快。 - Eduardo Ivanec