题目链接

题目:

通过置换*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");
} }

欧拉工程第51题:Prime digit replacements的更多相关文章

  1. 欧拉工程第74题:Digit factorial chains

    题目链接:https://projecteuler.net/problem=74 数字145有一个著名的性质:其所有位上数字的阶乘和等于它本身. 1! + 4! + 5! = 1 + 24 + 120 ...

  2. 欧拉工程第69题:Totient maximum

    题目链接 欧拉函数φ(n)(有时也叫做phi函数)可以用来计算小于n 的数字中与n互质的数字的个数. 当n小于1,000,000时候,n/φ(n)最大值时候的n. 欧拉函数维基百科链接 这里的是p是n ...

  3. 欧拉工程第70题:Totient permutation

    题目链接 和上面几题差不多的 Euler's Totient function, φ(n) [sometimes called the phi function]:小于等于n的数并且和n是互质的数的个 ...

  4. 欧拉工程第56题:Powerful digit sum

    题目链接   Java程序 package projecteuler51to60; import java.math.BigInteger; import java.util.Iterator; im ...

  5. 欧拉工程第63题:Powerful digit counts

    题目链接 The 5-digit number, 16807=75, is also a fifth power. Similarly, the 9-digit number, 134217728=8 ...

  6. 欧拉工程第60题:Prime pair sets

    题目链接 五个数,任意两个数的任意链接后的数还是质数 满足这个条件的最小五个数的和是多少? 结果:26033 纯暴力破解: package projecteuler51to60; import jav ...

  7. 欧拉工程第67题:Maximum path sum II

    By starting at the top of the triangle below and moving to adjacent numbers on the row below, the ma ...

  8. 欧拉工程第66题:Diophantine equation

    题目链接 脑补知识:佩尔方差 上面说的貌似很明白,最小的i,对应最小的解 然而我理解成,一个循环的解了,然后就是搞不对,后来,仔细看+手工推导发现了问题.i从0开始变量,知道第一个满足等式的解就是最小 ...

  9. 欧拉工程第65题:Convergents of e

    题目链接 现在做这个题目真是千万只草泥马在心中路过 这个与上面一题差不多 这个题目是求e的第100个分数表达式中分子的各位数之和 What is most surprising is that the ...

随机推荐

  1. 如何查看hadoop与hbase的版本匹配关系

    官网:http://hbase.apache.org/book.html 搜索:Hadoop version support matrix 下面有一个二维的支持关系表.

  2. EF6 在原有数据库中使用 CodeFirst 总复习(一、搭建基础环境)

    本来以为已经会了,可动手时发现许多问题还是模糊不清,正所谓眼高手低.只能重新查资料,再复习一遍. vs.net2013 ef6 mvc5 sqlserver2008   一.建立数据库  Bloggi ...

  3. Protocol-SPI协议

    说明.文章摘自:SPI协议及其工作原理浅析 http://bbs.chinaunix.net/thread-1916003-1-1.html 一.概述. SPI,Serial Peripheral I ...

  4. 基于.net mvc的校友录(六、codefirst的使用以及班级模块的关键部分实现)

    通过EF将新用户存入数据库 这里,探讨一下如何使用EF的code first将数据存入数据库,以及如何对用户的密码进行md5加密与验证.下面是用户登陆的前台代码. @using (Html.Begin ...

  5. c语言编程之双向循环链表

    双向循环链表就是形成两个环,注意每个环的首尾相连基本就可以了. 程序中采用尾插法进行添加节点. #include<stdio.h> #include<stdlib.h> #de ...

  6. javascript学习小记(一)

    大四了,课少了许多,突然之间就不知道学什么啦.整天在宿舍混着日子,很想学习就是感觉没有一点头绪,昨天看了电影激战.这种纠结的情绪让我都有点喘不上气啦!一点要找点事情干了,所以决定找个东西开始学习.那就 ...

  7. storm集成kafka

    kafkautil: import java.util.Properties; import kafka.javaapi.producer.Producer; import kafka.produce ...

  8. Tomcat配置HTTPS方式生成安全证书

    在Tomcat 6中配置SSL双向认证是相当容易的,本文将介绍如何使用JDK的keytool来为Tomcat配置双向SSL认证.并实现批量生成证书 系统需求:JDK 5.0Tomcat 6.0.16启 ...

  9. Android中的单位及测试相关概念

    android中的单位: in 英寸 pt 点距 px 像素  dp(dip) 密度无关的像素单位,自适应device屏幕的比例,通常涉及长宽高时采用 sp 与范围无关的像素单位,通常在设置字体大小时 ...

  10. 引擎设计跟踪(九.9) 文件包系统(Game Package System)

    很早之前,闪现过写文件包系统的想法, 但是觉得还没有到时候. 由于目前工作上在做android ndk开发, 所以业余时间趁热做了android的移植, 因为android ndk提供的mountab ...