问题描述
如果一个质数 P 的每位数字都是质数, 而且每两个相邻的数字组成的两位 数是质数, 而且每三位相邻的数字组成的三位数是质数, 依次类推, 如果每相 邻的 k 位数字组成的 k 位数都是质数, 则 P 称为超级质数。
如果把超级质数 P 看成一个字符串, 则这个超级质数的每个子串都是质数。
例如, 53 是一个超级质数。
请问, 最大的超级质数是多少?
答案提交
这是一道结果填空的题, 你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。
思路:
题目表达了两点要求:
1.该数字必须是质数,并且每一位都是质数
2.该数字的所有子串都必须是质数
思路借鉴自 CSDN博主「尐镇做题家」,原文链接:https://blog.csdn.net/qq_32468603/article/details/128674658
代码分析:
首先定义一个函数,实现第一个要求。次函数内又分为2步:第一步,检验字符串num中的每个字符是否为质数,因为10以内的质数只有2,3,5,7,所以只用判断一下是否其中的字符是在这4个数中即可;第二步:检验这个数字本身是质数(筛法)。把第一步放在前面效率更高。
sma_zi = ['2','3','5','7'] #10以内的质数
#sma_zi = '2357'也行
def devision(num):
#判断每一个数字
for i in num:
if i not in sma_zi:
return 0
#判断整个数字
n = int(num)
for i in range(2,int(n**0.5)):
if n%i == 0:
return 0
return 1
2.然后定义一个函数实现第二个要求,传入参数num为字符串:
!注意:children列表每次要更新为空列表,否则会包含前面所有数字的子字符串,那即是这个数是符合要求的,只要它前面有不符合要求的数,这个数的返回就为0,而不是1,从而出现错误。
def child(num):#取出num中的子串
children = [] #每次要是一个新的列表!!不然到373,前面不成立的也在列表中,让div=0
for i in range(0,len(num)-1):
for j in range(i+1,len(num)):
children.append(num[i:j+1])
for ch in children:
div = devision(ch)
if div == 0:
return 0
return 1
3.整体实现:(sys.maxsize可以表示Python中的最大整数)
import sys
sma_zi = ['2','3','5','7'] #10以内的质数
def devision(num):
#判断每一个数字
for i in num:
if i not in sma_zi:
return 0
#判断整个数字
n = int(num)
for i in range(2,int(n**0.5)):
if n%i == 0:
return 0
return 1
def child(num):#取出num中的子串
children = [] #每次要是一个新的列表!!不然到373,前面不成立的也在列表中,让div=0
for i in range(0,len(num)-1):
for j in range(i+1,len(num)):
children.append(num[i:j+1])
for ch in children:
div = devision(ch)
if div == 0:
return 0
return 1
maxnum = 2
for num in range(2,sys.maxsize):
num = str(num)
d1 = devision(num)
d2 = child(num)
if d1 and int(d2) == 1:
maxnum = int(num)
print(maxnum)
结果:
373