euler项目#10无法在java上得到答案

时间:2015-02-19 19:22:16

标签: java

public static void main(String[] args) {
    long sum=0;

    problemTen a= new problemTen();
    for (int i=2; i<2000000 ; i++){
        if(a.isPrime(i))
            sum += i;

    }
    System.out.println(sum);



}

public boolean isPrime(long num){
    if(num==1) return false;
    if(num==2) return true;
    for (int k=2; k<num; k++){
        if(num%k ==0) return false;
    }
    return true;

}

控制台没有给我任何答案。你能帮忙吗?

1 个答案:

答案 0 :(得分:2)

您的代码似乎运行缓慢。您可以通过以下几种方式改善其性能:

  • 您不需要在1方法中测试2isPrime(long num),因为您已经开始从2进行循环,并且您已经在测试此值for (int k=2; k<num; k++){
  • 不测试所有数字,但只测试奇数(你已经知道46,......不是素数)所以不是

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

    你可以使用

    for (int i=3; i<2000000 ; i+=2)
    //         ^              ^^^^ - changes
    

    但请勿忘记使用sum而不是2初始化0

  • 但对性能的最大影响是避免在sqrt(num)中测试高于isPrime值的值。想一想,如果某个数字不是素数,则意味着它可以写成number = x * y。假设x&lt; = y我们知道x&lt; = sqrt(number)&lt; = y,所以如果我们警告我们无法找到x搜索y没有意义。所以在isPrime而不是

    for (int k=2; k<num; k++)
    

    使用

    int sqrt = (int) Math.sqrt(num);  
    for (int k = 2; k <= sqrt; k++)
    //              ^^^^^^^^^^  
    

    因此对num 123454321来说,最大迭代次数不会是~123454321,而是sqrt(123454321) = 11111