본문 바로가기

코딩 테스트/Project Euler @ kr

50) 1백만 이하의 소수 중 가장 길게 연속되는 소수의 합으로 표현되는 수는?

반응형

http://euler.synap.co.kr/prob_detail.php?id=50


에라토스테네스의 체를 사용하여 (합성수의 배수를 지우는 것)


소수 0번째부터 마지막까지의 합을 구함 (사실 소수의 합이 1000000을 넘지 않을때 까지)


(0번째 부터 i번째 까지의 합) - (0번째 부터 j번째 까지의 합) = (j+1번째 부터 i번째 까지의 합) 을 이용


ex)

(1~10의 합) - (1~8의 합) = (9~10의 합)

    55         -      36      =      19


Skillist 설명---------------------------------------------------------------------------------


public static void main (String[] args){

boolean sosuTF[] = new boolean[1000001]; //0~1000000

LinkedList<Integer> sosusum = new LinkedList<Integer>();

int maxsu = 0;

int totalsum = 2;

sosuTF[0]=true;

sosuTF[1]=true; 

for(int i=2;i<=1000000;i++){ //에라토스테네스의 체

if(sosuTF[i]){

continue;

}

for(int j=i+i;j<=1000000;j+=i){

sosuTF[j]=true; //합성수

}

}

for(int i=2;totalsum<1000000;i++){

if(!sosuTF[i]){ //소수 찾아서

sosusum.add(totalsum);

totalsum+=i;

}

}

totalsum=0;

for(int i=sosusum.size()-1;i>=0;i--){

for(int j=0;sosusum.get(j)<sosusum.get(i);j++){

if(!sosuTF[sosusum.get(i)-sosusum.get(j)]){ //소수면

if(maxsu<i-j+1){

maxsu = i-j+1;

totalsum = sosusum.get(i)-sosusum.get(j);

}

}

}

}

System.out.println("결과 : " + maxsu + "번 -> " + totalsum);

}

반응형