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* ...
随机推荐
- [ZJOI2006]物流运输trans
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...
- HashTable、Dictionary、ConcurrentDictionary三者区别
转载自https://blog.csdn.net/yinghuolsx/article/details/72952857 1.HashTable HashTable表示键/值对的集合.在.NET Fr ...
- 可能是把 ZooKeeper 概念讲的最清楚的一篇文章
转载自:https://github.com/Snailclimb/JavaGuide/blob/master/%E4%B8%BB%E6%B5%81%E6%A1%86%E6%9E%B6/ZooKeep ...
- 超实用的mysql分库分表策略,轻松解决亿级数据问题
一.分库分表的背景 在数据爆炸的年代,单表数据达到千万级别,甚至过亿的量,都是很常见的情景.这时候再对数据库进行操作就是非常吃力的事情了,select个半天都出不来数据,这时候业务已经难以维系.不得已 ...
- PHP in_array
1.函数的作用:判读一个元素是否在一个数组存在 2.函数的参数: @param mixed $needle @param array $array 3. if it’s ok to use isset ...
- Spring Boot2 系列教程(十四)CORS 解决跨域问题
今天和小伙伴们来聊一聊通过CORS解决跨域问题. 同源策略 很多人对跨域有一种误解,以为这是前端的事,和后端没关系,其实不是这样的,说到跨域,就不得不说说浏览器的同源策略. 同源策略是由 Netsca ...
- Cocos2d-x 学习笔记(12) Speed Follow
Speed Follow都是直接继承了Action. Speed对其他action进行包装,改变action的速度. Follow可用于node在scene中的运动,scene将node作为Follo ...
- 8种常见的SQL错误用法
常见SQL错误用法 1. LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般DBA想到的办法是在type, name, create_time字 ...
- 常用函数-Time
#pragma pack(push,1) /* 在这中间定义的结构体,已单字节对齐 */ #pragma pack(pop) /************************************ ...
- (22)ASP.NET Core EF创建模型(索引、备用键、继承、支持字段)
1.索引 索引是跨多个数据存储区的常见概念.尽管它们在数据存储中的实现可能会有所不同,但也可用于基于列(或一组列)更高效地进行查找. 1.1约定 按照约定,将在用作外键的每个属性(或一组属性)中创建索 ...