Project Euler 51: Prime digit replacements
通过替换*3这样一个两位数的第一位,我们可以发现形成的九个数字有六个是质数,即13, 23,43,53,73,83。类似的,如果我们用同样的数字替换56**3这样一个五位数的第三位和第四位,会生成56003, 56113, 56333, 56443, 56663, 56773, 56993七个质数,事实是56003是拥有这个性质的最小质数。已知对于一个质数,可以通过使用相同的数字替换这个质数的一部分(不一定是相邻的数位),可以生成八个质数,求满足这个条件的最小质数。
分析:欧拉工程的前五十题都是难度系数为5%的题,这是我们碰到的第一个道难度系数为15%的题,所以在解题思路上会相对更复杂一些。因为题目对所求质数是几位数以及替换数位有几位都没有给出规定,所以需要我们自己来分析以缩小筛选的范围。首先我们来看如果要满足题目的要求,替换的数位应该是几位。我们知道一个数字的各位数之和如果能够被三整除,则这个数字必然可以被三整除。因此,假设我们所求质数\(p\)的各位数之和为\(s\),则\(s\)除三的余数只能等于一或者二,设这个余数为\(r\),即\(s\equiv r\ (mod\ 3)\)。假设我们替换的数位个数为\(d\),即当\(d=1\)时,我们替换质数\(p\)的一位数;当\(d=2\)时,我们替换质数\(p\)的两位数,同时假设\(d\)除三的余数为\(x\),即\(d\equiv x\ (mod\ 3)\),则\(x\)的取值有\(0,1,2\)三种情况。
假设\(x=0\),即\(d\)是三的倍数,我们可以替换原数字的三位数、六位数、九位数等等。易知替换形成的九个数的各位数数字之和分别为\(s+d,s+2d,s+3d\cdots,s+9d\),则这九个数除三的余数为:
\]
因为\(r=1\)或者\(r=2\),则易知这九个数都不能被三整除。则我们可以得出结论说:如果替换的数位是三或者三的倍数,则形成的数字必然不能被三整除。现在假设\(d\)不是三的倍数,则\(x\)会取一或者二。当\(x=1\)时,形成的九个数除三的余数分别为\(r+1,r+2\cdots,r+9\),显然这九个连续的自然数中会有三个被三整除,从而使得替换后形成的质数最多只有七个,不能满足题目要求。同理,当\(x=2\)时,形成的九个数除三的余数分别为\(r+2,r+4\cdots,r+18\),这九个数中同样会有三个被三整除,使得形成的质数只有七个。据此,我们可以得出结论:除非替换的数位个数是三或者三的倍数,否则形成质数个数最多只能有七个,不能满足题目要求。
此外,因为我们要求的是满足要求的最小质数,因此最小质数的被替换的数位只是\(0,1,2\),因为如果数位大于二,则比它的大的数最多只有六个,不可能形成八个满足条件的数。最后,因为要求重复的数位至少要有三位,则所求质数至少应是一个四位数,因为111,222,333之类的三位数必然不是素数。综上,我们得出所求质数必然要满足三个条件:(1)至少要是一个四位数,我们可以从数字1111开始搜寻;(2)重复的数位只能是三或三的倍数;(3)重复的数字只能是0, 1, 2三个数。
根据以上的推理,我们可以编写一个函数判断某个质数是否是符合条件的数。首先判断重复数位是否是三或三的倍数以及重复数字是否是0, 1, 2。如果不满足要求,则返回假。如果满足要求,则将其重复数字依次替换成比它大的截至到九的数字,统计形成的数中有多少个质数,如果形成的质数个数不等于八,则返回假,否则返回这个质数,即为我们要求的数。我们从1111开始向上搜寻,找到的第一个符合条件的数即为题目所求。代码如下:
# time cost = 355 ms ± 1.51 ms
from sympy import nextprime,isprime
from collections import Counter
def is_replacable_prime(n):
s = str(n)
count = Counter(s)
num,d = count.most_common(1)[0]
if d % 3 == 0 and num in set('012'):
k = 1
for j in range(int(num)+1,10):
new = s.replace(num,str(j))
if isprime(int(new)):
k += 1
if k == 8:
return True
return False
def main():
n = 1111
while True:
p = nextprime(n)
if is_replacable_prime(p):
return p
else:
n = p
Project Euler 51: Prime digit replacements的更多相关文章
- 欧拉工程第51题:Prime digit replacements
题目链接 题目: 通过置换*3的第一位得到的9个数中,有六个是质数:13,23,43,53,73和83. 通过用同样的数字置换56**3的第三位和第四位,这个五位数是第一个能够得到七个质数的数字,得到 ...
- Project Euler 92:Square digit chains C++
A number chain is created by continuously adding the square of the digits in a number to form a new ...
- Project Euler 20 Factorial digit sum( 大数乘法 )
题意:求出100!的各位数字和. /************************************************************************* > Fil ...
- Project Euler 16 Power digit sum( 大数乘法 )
题意: 215 = 32768,而32768的各位数字之和是 3 + 2 + 7 + 6 + 8 = 26. 21000的各位数字之和是多少? 思路:大数乘法,计算 210 × 100 可加速计算,每 ...
- Project Euler 56: Powerful digit sum
一个古戈尔也就是\(10^{100}\)是一个天文数字,一后面跟着一百个零.\(100^{100}\)更是难以想像的大,一后面跟着两百个零.但是尽管这个数字很大,它们各位数字的和却只等于一.考虑两个自 ...
- Project Euler 60: Prime pair sets
素数3, 7, 109, 673很有意思,从中任取两个素数以任意顺序拼接起来形成的仍然是素数.例如,取出7和109,7109和1097都是素数.这四个素数的和是792,是具有这样性质的四个素数的最小的 ...
- Project Euler 63: Powerful digit counts
五位数\(16807=7^5\)也是一个五次幂,同样的,九位数\(134217728=8^9\)也是一个九次幂.求有多少个\(n\)位正整数同时也是\(n\)次幂? 分析:设题目要求的幂的底为\(n\ ...
- Project Euler Problem 16-Power digit sum
直接python搞过.没啥好办法.看了下别人做的,多数也是大数乘法搞过. 如果用大数做的话,c++写的话,fft优化大数乘法,然后快速幂一下就好了.
- Python练习题 044:Project Euler 016:乘方结果各个数值之和
本题来自 Project Euler 第16题:https://projecteuler.net/problem=16 ''' Project Euler 16: Power digit sum 2* ...
随机推荐
- tomcat容器是如何创建servlet类实例
当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息. 然后,将每个应用中注册的servlet类都进行加载,并通过反 ...
- http post 请求,带参数,带请求头
#!/usr/bin/env python # -*- coding: utf-8 -*- import requests import json url = 'http://............ ...
- 网络下载器 Internet Download Manager v6.35.5 绿色便携版
Internet Download Manager,简称 IDM,是国外的一款优秀网络下载工具.目前凭借着下载计算的速度优势在外媒网站中均受好评,现在已被多数国人熟知.Internet Downloa ...
- 02-16 k近邻算法
目录 k近邻算法 一.k近邻算法学习目标 二.k近邻算法引入 三.k近邻算法详解 3.1 k近邻算法三要素 3.1.1 k值的选择 3.1.2 最近邻算法 3.1.3 距离度量的方式 3.1.4 分类 ...
- ACM-图论-同余最短路
https://www.cnblogs.com/31415926535x/p/11692422.html 一种没见过的处理模型,,记录一下,,主要是用来处理一个多元一次方程的解的数量的问题,,数据量小 ...
- 技术不错的Java程序员,为何面试却“屡战屡败”
为何很多有不少编程经验,技术能力不错的程序员,去心仪公司面试时却总是失败?至于失败的原因,可能很多人都没意识到过. 01想要通关面试,千万别让数据结构拖了后腿 很多公司,比如 BAT.Google.F ...
- 树莓派(4B)Linux + .Net Core嵌入式-HelloWorld(二)
一.新建.Net Core项目 新建.Net Core3.0的控制台应用,代码如下 namespace Demo { class Program { static void Main(string[] ...
- django-orm框架表单的增删改查
08.14自我总结 django-orm框架 一.orm基本配置 1.创建django项目 命令行:cmd先去到django创建目录,然后输入django-admin startproject dja ...
- CSS中的各种单位
单位 描述 ...
- 渗透-简单制作过waf的中国菜刀
0x01 简单分析 web渗透中很常见的情况,用菜刀连接免杀的一句话木马连不上,有waf 除了变形一句话木马为免杀一句话,我们还需要来制作过waf的菜刀进行连接. 这里用的一句话为 来看看菜刀连接一句 ...