题目链接

题目:

通过置换*3的第一位得到的9个数中,有六个是质数:13,23,43,53,73和83。

通过用同样的数字置换56**3的第三位和第四位,这个五位数是第一个能够得到七个质数的数字,得到的质数是:56003, 56113, 56333, 56443, 56663, 56773, 和 56993。因此其中最小的56003就是具有这个性质的最小的质数。

找出最小的质数,通过用同样的数字置换其中的一部分(不一定是相邻的部分),能够得到八个质数。

解题思想:

这个题目是很难的

你首先要找到可能替换匹配的模板

唯一的信息就是这个数是质数,除1和本身外不能别其他整数整除。

这个数不能被三整除,(根据不能被三整除,找出这个数的模板,这个是在网上看到的),这个数一定不能被三整除。

假设这八个质数是5位数

假设这个5位数各位数字是:a、b、c、d、e

(a+b+c+d+e)%3只能取1,2

若是只替换其中1位:

e

下面对(a+b+c+d)%3 的取值分类讨论

1.(a+b+c+d)%3==0,e%3==1,2.e 取值:1,2,4,7,8,最多只能有5个这样的质数

2.(a+b+c+d)%3==1 ,e%3==0,1 e  取值:0,1,3,4,6,7,9,不合适

3..(a+b+c+d)%3==2 ,e %3==0,2 .e 取值:0,3,5,6,8,9,不合适

若是只替换其中2位:

d == e

下面对(a+b+c)%3 的取值分类讨论

1.(a+b+c)%3==0,2e%3==1,2.e 取值:1,2,4,5,7,8,不合适

2.(a+b+c)%3==1 ,2e%3==0,1 e  取值:0,2,3,5,6,8,9,不合适

3..(a+b+c)%3==2 ,2e %3==0,2 .e 取值:0,1,3,4,6,7,9,不合适

若是只替换其中3位:

c==d == e

下面对(a+b)%3 的取值分类讨论

1.(a+b)%3==0,3e%3==1,2.无值可取,不合适

2.(a+b)%3==1 ,3e%3==0,1 e  取值:0,1,2,3,4,5,6,7,8,9,合适

3..(a+b)%3==2 ,3e %3==0,2 .e 取值:0,1,2,3,4,5,6,7,8,9,合适

根据上面可以发现规律:

我们考虑问题的重点是替换部分是几位的数字,与这个数是几位数字关系不大。

替换部分是三位数:替换部分可以是:000,111,222,333,444,555,666,777,888,999

原始数可能是四位数或者是五位数。

替换几个数字我们知道了

具体替换到哪几位还不知道。。。

这个时候就只能暴力了。。。

如果是五位数:

替换模型可能是:

//a是要换的 ,相同数据,b是保持不变的
        String[] digits5={"baaab",
                          "abaab",
                          "aabab",
                          "aaabb"};

a不能在最后一位,是的话就不够8个质数了。

如果是六位数:

替换模型可能是:

String[] digits6={"bbaaab",
        "babaab",
         "baabab",
         "baaabb",
         "abbaab",
        "ababab",
        "abaabb",
        "aabbab",
         "aababb",
         "aaabbb"};

下面就纯暴力破解了

根据模板产生9个数

判断这九个数中是否有8个质数

有就ok

运行输出结果:

[109, 111109, 222109, 444109, 555109, 666109, 777109, 888109]
[121313, 222323, 323333, 424343, 525353, 626363, 828383, 929393]
[40609, 141619, 242629, 343639, 444649, 646669, 747679, 949699]
[857, 111857, 222857, 333857, 555857, 666857, 777857, 888857]

输入109不对,输入121313,ok这里是要求的是数长度是6

java代码:

package projecteuler51to60;

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

class level51{    
    void solve0(){
        //a是要换的 ,相同数据,b是保持不变的
        String[] digits5={"baaab",
                          "abaab",
                          "aabab",
                             "aaabb"};
        String[] digits6={"bbaaab",
                          "babaab",
                          "baabab",
                          "baaabb",
                       
                       "abbaab",
                       "ababab",
                       "abaabb",
                       
                       "aabbab",
                       "aababb",
                       
                       "aaabbb"};
        TreeSet<String> ts = new TreeSet<String>();
        
        for(int i=0;i<=9;i++){
            for(int j=0;j<=9;j++){
                for(int k=0;k<digits5.length;k++){
                ts=Combination(i, j, 0, digits5[k], true);
                if(isPrimeSet(ts))
                System.out.println(i+" "+j+" "+ts+" "+digits5[k]);
                }
                
            }
        }
        TreeSet<String> ts2 = new TreeSet<String>();
        for(int i=0;i<=9;i++){
            for(int j=0;j<=9;j++){
                for(int m=0;m<=9;m++){
                for(int k=0;k<digits6.length;k++){
                ts2=Combination(i, j, m, digits6[k], false);
                if(isPrimeSet(ts2)){
//                System.out.println(i+" "+j+" "+ts2+" "+digits6[k]);
                System.out.println(getPrimeSet(ts2));//121313
            
                }
                }
                }
            }
        }

    }
    TreeSet<Integer> getPrimeSet(TreeSet<String> ts){
        Iterator<String> it=ts.iterator();
        TreeSet<Integer> tset = new TreeSet<Integer>(); 
        while(it.hasNext()){
            int prime=Integer.parseInt(it.next());//强制类型转换
            if(isPrime(prime)){
                tset.add(prime);
            }
        }
        
        return tset;
             
    }
    
    boolean isPrimeSet(TreeSet<String> ts){
        Iterator<String> it=ts.iterator();
        int flag=0;
        while(it.hasNext()){
            int prime=Integer.parseInt(it.next());//强制类型转换
            if(isPrime(prime)){
                flag+=1;
            }
        }
        if(flag>=8)
            return true;
        return false;
             
    }

    TreeSet<String> Combination(int A,int B,int C,String pattern,boolean flag){
        //第一个1用a代替,第二个1以b代替,第三个1用c代替
        
        TreeSet<String> TSet= new TreeSet<String>();
        if(flag==true){// 5位数
            for(int i=0;i<=9;i++){
                String combStr=pattern.replaceFirst("b", A+"");
                combStr=combStr.replaceFirst("b", B+"");
                combStr=combStr.replace("a", i+"");
                TSet.add(combStr);
            }
        }else if(flag==false){// 6位数
            for(int i=0;i<=9;i++){
                String combStr=pattern.replaceFirst("b", A+"");
                combStr=combStr.replaceFirst("b", B+"");
                combStr=combStr.replaceFirst("b", C+"");
                combStr=combStr.replace("a", i+"");
                TSet.add(combStr);
                
            }
        }
        return TSet;
    }

    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 Problem51 {


    public static void main(String[] args){
        long begin= System.currentTimeMillis();
        new level51().solve0();
        long end = System.currentTimeMillis();
        long Time = end - begin;
        System.out.println("Time:"+Time/1000+"s"+Time%1000+"ms");
    }

}