五个数,任意两个数的任意链接后的数还是质数
满足这个条件的最小五个数的和是多少?
结果:26033
纯暴力破解:
package projecteuler51to60; import java.util.ArrayList; import java.util.List; import java.util.TreeSet; class level60{ void solve1(){ List<Integer> primes = new ArrayList<>(); int Max = 10000; boolean flag=true; primes.add(3); int nextPrime = 3; while(primes.size()!=5){ // System.out.println(nextPrime); nextPrime = nextPrimes(nextPrime); flag=true; for(int i=0;i<primes.size();i++){ if(concatPrime(primes.get(i),nextPrime) ==false){ flag = false; } } if(nextPrime>Max && flag==true){ primes.add(nextPrime); // System.out.println(nextPrime); } if(nextPrime>Max){ System.out.println(primes.size()); int temp = primes.remove(primes.size()-1); primes.add(temp); } } int sum=0; for(int i=0;i<primes.size();i++){ sum+=primes.get(i); System.out.println(primes.get(i)+" "); } } int nextPrimes(int a){ for(int i = a+1;;i++) if(isPrime(i)) return i; } void solve0(){ int Max =10000; boolean[] primeArray = new boolean[Max]; for(int i=1;i<Max;i++) if(isPrime(i)) primeArray[i]= true; else primeArray[i]=false; for(int i=3;i<Max;i=i+2){ int a=i; if(isPrime(a)){ for(int b=a+2;b<Max;b=b+2){ if(isPrime(b) &&concatPrime(a,b)){ for(int c=b+2;c<Max;c=c+2){ if(isPrime(c) && concatPrime(a,c) &&concatPrime(b,c)){ for(int d=c+2;d<Max;d=d+2){ if(isPrime(d)&&concatPrime(a,d) &&concatPrime(b,d) &&concatPrime(c,d)){ for(int e=d+2;e<Max;e=e+2){ if(isPrime(e) &&concatPrime(a,e) &&concatPrime(b,e) &&concatPrime(c,e)&&concatPrime(d,e)){ System.out.println(a+b+c+d+e); System.out.println(a+" "+b+" "+c+" "+d+" "+e); return; } } } } } } } } } } } boolean concatPrime(int a,int b){ String digit1=String.valueOf(b)+String.valueOf(a); String digit2=String.valueOf(a)+String.valueOf(b); if(isPrime(Integer.parseInt(digit1)) &&isPrime(Integer.parseInt(digit2))) return true; return false; } boolean isPrime(int num){ if(num==2||num==3 ||num==5||num==7) return true; if(num<2 || num%2==00) return false; for(int i=3;i<=Math.sqrt(num);i++) if(num%i==0) return false; return true; } } public class Problem60 { public static void main(String[] args){ long begin= System.currentTimeMillis(); new level60().solve0(); long end = System.currentTimeMillis(); long Time = end - begin; System.out.println("Time:"+Time/1000+"s"+Time%1000+"ms"); } }