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);
}