zoukankan      html  css  js  c++  java
  • 欧拉工程第51题:Prime digit replacements

    题目链接

    题目:

    通过置换*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");
        }
    
    }
  • 相关阅读:
    不停机还能替换代码?6年的 Java程序员表示不可思议
    redis 分布式锁的 5个坑,真是又大又深
    一口气说出 4种 LBS “附近的人” 实现方式,面试官笑了
    真没想到,Springboot能这样做全局日期格式化,有点香!
    springboot + aop + Lua分布式限流的最佳实践
    不可思议的hexo,五分钟教你免费搭一个高逼格技术博客
    Redis开发运维的陷阱及避坑指南
    Jar包一键重启的Shell脚本及新服务器部署的一些经验
    与Redis的初次相识,Redis安装、启动与配置
    SpringBoot项目中应用Jedis和一些常见配置
  • 原文地址:https://www.cnblogs.com/theskulls/p/4671936.html
Copyright © 2011-2022 走看看