код Python не работает правильно, то же самое в Java делает - PullRequest
3 голосов
/ 09 марта 2012

Я пытался решить проблему Project Euler 10 с помощью python, но моя программа дала неправильный результат. Так как я полный новичок в 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 приветствуются.

Ответы [ 3 ]

4 голосов
/ 09 марта 2012

Попробуйте запустить с вашим кодом, например isPrime(49).Вы должны выяснить свою проблему оттуда.Вы заменили > на >= в if (tag > rootOfNumber). Также как некоторый стиль кодирования, вы можете просто заменить первые строки на:

if i in (2, 3, 5, 7): return 1
elif number % 2 == 0: return 0
else:
    ......
2 голосов
/ 09 марта 2012

После быстрого просмотра мне кажется, что эта строка в версии Python является излишней, и это может быть причиной проблемы:

elif number % 2 == 0: return 0
1 голос
/ 09 марта 2012

Почему бы вам не вернуть False для возвращаемого значения 0?Это сделало бы это проще.

...