关于Java的项目euler练习10。 isPrime方法在循环中不起作用

时间:2013-08-14 15:07:23

标签: java primes

所以,我正在开始学习编程并尝试用java编写项目euler。问题10看起来非常简单,我认为我可以使用一种方法,以前在另一个问题中获得质数。问题是,该方法有效,除非我把它放在for循环中,我无法看到它与另一个之间的差异。

所以这是我的代码

package euler10;
public class Primesum {
    public static void main(String[] args) {
        int suma=0;

        for (int i=0; i<2000000; i=i+2){

            if (isPrime(i) == true){
                System.out.println(i);
                suma=suma+i;
            }

        }
        System.out.println(suma);
    }

    public static boolean isPrime(int num) {
         boolean prime = false;
         long i;
        for (i=2; i < Math.sqrt(num) ; i++){
            long n = num%i;
            if (n == 0){
                prime = false;
            } else {
                prime = true;
            }
        }
        return prime;
    }
}

isPrime方法在循环中运行良好,但在其中它总是正确的。即使是偶数,它也会返回真实,我认为那些不是很优质:)

2 个答案:

答案 0 :(得分:2)

我真的不认为循环有任何关系......

然而,代码中存在逻辑缺陷......

public static boolean isPrime(int num) {
    long i;
    for (i=2; i <= Math.sqrt(num) ; i++){
        long n = num%i;
        if (n == 0){
            return false;//found a divisor : not prime
        } 
    }
    //went through all the way to sqrt(num), and found no divisor: prime!
    return true;
}

我们可以在找到第一个除数时停止,没有必要找到所有这些 - 这是另一个练习......

另外,从逻辑上讲,如果想要以这种方式使用布尔变量,那么它将使用true进行初始化,然后放入false,并在找到除数时保持该值。 ..

答案 1 :(得分:0)

您的isPrime功能不正确;你应该将return true语句延迟到循环结束之后,当你知道 i 的所有值都没有除以 num 时。

此外,试验分割对于这个问题不是一个好的算法;使用筛子会快得多。这是一个使用Eratosthenes筛子对小于 n 的素数求和的算法:

function sumPrimes(n)
    sum := 0
    sieve := makeArray(2..n, True)
    for p from 2 to n
        if sieve[p]
            sum := sum + p
            for i from p*p to n step p
                sieve[i] := False
    return sum

这应该在不到一秒的时间内计算少于200万的素数之和,这比你的程序要快得多。如果您对使用素数进行编程感兴趣,或者如果您打算解决一些更高级的Project Euler问题并且需要一些更快的算法,我在我的博客上谦虚地推荐这个essay