题目链接

 

五个数,任意两个数的任意链接后的数还是质数

满足这个条件的最小五个数的和是多少?

结果: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");
    }

}