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* ...
随机推荐
- 报错fatal: refusing to merge unrelated histories
提交到远程仓库的时候报错如下 是因为远程仓库有东西更新,但本地仓库没有更新造成提交失败 需要先把远程仓库给拉取下来,执行命令git pull origin master,又报错了如下 是因为两个仓库提 ...
- 从零开始入门 K8s | 可观测性:监控与日志
作者 | 莫源 阿里巴巴技术专家 一.背景 监控和日志是大型分布式系统的重要基础设施,监控可以帮助开发者查看系统的运行状态,而日志可以协助问题的排查和诊断. 在 Kubernetes 中,监控和日志 ...
- Redis系列总结--这几点你会了吗?
文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 前面几篇已经对Redis中几个关键知识点做了介绍,本篇主要对Redis系列做一下总结以及对Redis中常见面试 ...
- Numpy中的三个常用正态分布相关的函数,randn,standard_normal, normal的区别
这三个函数都可以返回随机正态分布(高斯Gaussian 分布)的数组,都可以从numpy.random中导出 先看三个函数的参数方式: randn: randn(d0, d1, ..., dn), 返 ...
- shark恒破解笔记1-壳内寻找注册码
记录学习shark恒大教程的学习记录 壳内寻找注册码 OD打开 明显有壳 F9先运行程序 2.Ctrl+G输入401000到解码段,如果出现db ** 说明已经解码过,脱离了程序本身的壳 鼠标右键-& ...
- Flink实战| Flink+Redis实时防刷接口作弊
随着人口红利的慢慢削减,互联网产品的厮杀愈加激烈,大家开始看好下沉市场的潜力,拼多多,趣头条等厂商通过拉新奖励,购物优惠等政策率先抢占用户,壮大起来.其他各厂商也紧随其后,纷纷推出自己产品的极速版,如 ...
- RIDE-工程、测试套件、测试用例三者关系
理论 type的选择: 一般来说:测试项目(directory)-测试套件(file)-测试用例 本质上,“测试项目”和“测试套件”并没有什么区别,但是testcase只能放在file类型的test ...
- java23种设计模式(三)单例模式
原文地址:https://zhuanlan.zhihu.com/p/23713957 一.概述 1.什么是单例模式? 百度百科是这样定义的:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个 ...
- LeetCode 2: single-number II
Given an array of integers, every element appears three times except for one. Find that single one. ...
- django-模板之with标签(十二)
就是给传过来的值取个别名.