본문 바로가기

코딩 테스트/Project Euler @ kr

51) 일부 숫자를 치환했을 때 8개의 서로 다른 소수가 생기는 가장 작은 소수

반응형

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


제 코드 말고 다른 분 코드 보세요.

머리가 안돌아가서 꾸역꾸역 풀었네요.


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


public static void main (String[] args){

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

int maxsu = 0;

sosuTF[0]=true;

sosuTF[1]=true; 

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

if(sosuTF[i]){

continue;

}

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

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

}

}

int start = 10;

int end = 100;

int jarisu = 2;

for(int i=start;i<end;i++){

if(!sosuTF[i]){ //i가 소수이면

for(int j=i+1; j<end;j++){

if(!sosuTF[j]){ //j가 소수이면

String d = judgeD(i,j);

if(!d.equals("0")){ //d가 0,1로 이루어져 있으면

int num = 0;

for(int k=0;k<10;k++){

if(String.valueOf(i+(k*Integer.parseInt(d))).length()!=jarisu){

break;

}

try{

if(!sosuTF[i+(k*Integer.parseInt(d))] && judgeJ(d,i,i+(k*Integer.parseInt(d)))){

num+=1;

}

}catch(Exception e){

break;

}

}

if(num==8){

System.out.print(d + " : " );

System.out.print(i);

for(int k=0;k<10;k++){

//System.out.print((i+(k*Integer.parseInt(d))) + " / ");

}

System.out.println();

return ;

}

}

}

}

}

if(i==end-1){

start*=10;

end*=10;

jarisu+=1;

}

if(start==1000000){

return ;

}

}

}

public static String judgeD(int i,int j){ //공차가 1 or 0으로 이루어진 것 확인

String d="";

int q;

for(q=0;q<String.valueOf(i).length()-String.valueOf(j-i).length();q++){

d+="0";

}

char sameSu = String.valueOf(i).charAt(q);

d+= String.valueOf(j-i);

for(int k=0;k<d.length();k++){

if(d.charAt(k)!='0' && d.charAt(k)!='1'){

return "0";

}

if(d.charAt(k)=='1' && sameSu != String.valueOf(i).charAt(k)){

return "0";

}

}

//System.out.println("통과 : " + d);

return d;

}

public static boolean judgeJ(String d, int i,int j){ //i의 부분과 j의 부분이 같은지 확인

for(int k=0;k<d.length();k++){

if(d.charAt(k) == '0'){

if(String.valueOf(i).charAt(k)!=String.valueOf(j).charAt(k)){

return false;

}

}

}

return true;

}

반응형