Python代码无法正常运行,但同样的Java代码可以正常运行。

3
我尝试使用Python解决欧拉计划第10题,但我的程序给出了错误的结果。由于我对Python完全不熟悉,并且在我的(显然是暴力)逻辑中找不到任何错误,所以我用Java编写了一个程序(几乎是翻译),它给出了一个不同的结果,结果证明是正确的。
以下是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程序中的(糟糕)风格发表评论。


2
关于Python代码的一些注释: 1)不要使用1或0作为临时布尔值,应该使用True和False。 2)相关地,使用if func()这种形式的检查,而不是if func() == 1)。 3)使用l = [2, 3, 5, 7 ...],然后使用if number not in l来以更简单的方式检查已知值。这也使您可以动态地将其他已知质数添加到列表中,如果需要的话,可以使一些可能使用isPrime(在Euler中有很多这样的算法)的算法更快。 - Eduardo Ivanec
请问您能否写下您期望的输出以及实际得到的结果? - Jack_of_All_Trades
@Jack_of_All_Trades 输出应该是142913828922,但Python输出为143042032103。 - KK.
3个回答

4

尝试使用您的代码运行例如isPrime(49)。您应该从中找出问题所在。您已经将>替换为>=if(tag> rootOfNumber)中。

另外,作为一些编码风格,您可以只用以下内容替换第一行:

if i in (2, 3, 5, 7): return 1
elif number % 2 == 0: return 0
else:
    ......

+1:正如你所说,事实证明我没有考虑到完全平方数,而且更糟糕的是,在Java版本中我使用了>,而在Python版本中使用了>=。我的错。 - KK.

2

经过快速浏览,我认为Python版本中的这一行是多余的,并且可能是问题的原因:

elif number % 2 == 0: return 0

我已经注释掉了这一行并运行了程序,但输出结果仍然相同。我认为这一行没有以错误的方式改变任何东西。 - KK.

1
为什么不将返回值为0的情况改为返回False呢?这样会更简单明了。

+1:从现在开始我会的。现在,我更专注于仅仅获得正确的结果。 - KK.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接