Java项目Euler#50(解决方案无法正常工作)

时间:2015-01-13 01:53:45

标签: java algorithm debugging

我的结果是错的,但我找不到错误。

问题描述:

  

素数41可以写成六个连续素数的总和:41 = 2 + 3 + 5 + 7 + 11 + 13.这是连续素数的最长和,它加到低于一百的素数。连续素数低于1000的连续素数加上一个素数,包含21个项,等于953.哪个素数低于一百万,可以写成最连续素数的总和?

我的想法:

  
      
  1. 从第一个素数2开始,计算连续素数的最长和,这些素数会增加到<100>以下
  2.   
  3. 从最长的倒计时,对于每个特定的长度,计算从2开始的序列开始的总和,然后计算从第二个素数开始的序列开始的总和...
  4.   
  5. 当总和是素数时停止。
  6.   

我的代码:

public class Prob50 {
public static void main(String[] args) {
    // TODO Auto-generated method stub
    long sum=0;
    int count=0;
    for(int i = 2; ; i++){
        if(isPrime(i)){
            if((sum+=i)>1000000){
                sum-=i;
                break;
            }
            count++;
        }
    }

    int jump=0;
    boolean isOver= false;
    boolean isAns= false;
    for(;count>0;count--){
        jump=0;

        for(;;){
            int tempj=jump;
            int tempc=count;
            sum=0;
            for(int i = 2;tempc>0 ; i++){

                if(isPrime(i)&&tempj>0){
                    tempj--;
                    continue;
                }

                if(isPrime(i)){
                    tempc--;
                    if((sum+=i)>1000000){
                        sum-=i;
                        isOver=true;
                    }
                }
            }

            if(isPrime(sum)){
                isAns=true;
                break;
            }
            if(isOver){
                break;
            }
            jump++;
        }

        if(isAns){
            break;
        }

    }
    System.out.println(sum+" "+count);
}

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

我的结果:

  

958577 536

答案是997651,计数应该是543。

1 个答案:

答案 0 :(得分:2)

我想通了,只需要添加:

isOver= false;

isOver= false;for(;;){之间。