项目Euler#10,java

时间:2010-08-03 18:16:17

标签: java primes

  

可能重复:
  Project Euler, Problem 10 java solution not working

所以,我试图在Java中解决Project Euler Problem 10,但我得不到正确的答案。这是我的代码:

public class Problem10 {
public static void main(String[] args)
{
    long sum =0;
    for(int i =3;i<2000000;i+=2)
    {
        if(isPrime(i))
        {
            sum+=i;
        }
    }
    System.out.println(sum);
}

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

打印出142913828920,Euler告诉我的项目是错误的。

有什么想法吗?

(另外,我知道我找到素数的方法非常低效。)

4 个答案:

答案 0 :(得分:2)

for(int i =3;i<2000000;i+=2)

2是素数。

答案 1 :(得分:1)

只需分割素数,您就可以稍微加速代码。例如,您可以通过尝试将其除以2,3,5而知道35不是素数。不需要尝试4.诀窍是,无论何时找到素数,将其保存在列表中或一个向量。在你的isPrime函数中,只需迭代列表直到它达到sqrt(n)而不是3..sqrt(n)之间的每个值。

答案 2 :(得分:0)

使用Sieve可以更快地加速代码。

答案 3 :(得分:0)

我发现以下方法非常有效,当我检查数字是否为素数时,我只将数字除以先前找到的素数并且低于n的平方根。无需检查n的平方根以下的所有数字。它只需要超过一秒!

public class Problem10 {

    private static List<Long> listOfPrimes = new ArrayList<Long>();

    public static void main(String args[]) {

        long count = 0;
        for (long i = 2; i < 2000000; i++) {
            if (isPrime(i)) {
                count += i;
                System.out.print(i + " ");
            }
            if (i % 1000 == 0) {
                System.out.println();
            }
        }

        System.out.println("\nTotal " + count);

    }

    private static boolean isPrime(long n) {

        String strFromN = new Long(n).toString();
        if ((strFromN.length() != 1) && (strFromN.endsWith("2") || strFromN.endsWith("4") || strFromN.endsWith("5") || strFromN.endsWith("6") || strFromN.endsWith("8"))) {
            return false;
        }

        for (Long num : listOfPrimes) {
            if (num > Math.sqrt(n)) {
                break;
            }
            if (n % num.longValue() == 0) {
                return false;
            }
        }


        listOfPrimes.add(new Long(n));
        return true;
    }
}