蓝桥杯—超级质数python
文章目录
【问题描述】
如果一个质数 PP 的每位数字都是质数, 而且每两个相邻的数字组成的两位 数是质数, 而且每三位相邻的数字组成的三位数是质数, 依次类推, 如果每相 邻的 kk 位数字组成的 kk 位数都是质数, 则 PP 称为超级质数。
如果把超级质数 PP 看成一个字符串, 则这个超级质数的每个子串都是质数。
例如, 53 是一个超级质数。
请问, 最大的超级质数是多少?
最大运行时间:1s
最大运行内存: 256M
【解题思路】
质数定义
质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。
根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。最小的质数是2。
根据素数的定义,我们可以简单地想到:若要判断n是不是素数,我们可以直接写一个循环(i从2到n-1,进行n%i运算,即n能不能被i整除,如被整除即不是素数。若所有的i都不能整除,n即为素数)
1.个位数中质数有 2,3,5,7
pri_num = ['2', '3', '5', '7'] # 10以内的质数
2.判断该数中每一个数字是否为质数2,3,5,7
def devision(num):
# 判断每一个数字
for i in num:
if i not in pri_num:
return 0
3.判断该数是否为质数
# 判断整个数字
n = int(num)
for i in range(2, int(n / 2)):
if n % i == 0:
return 0
return 1
4.取出数字中的子串
def child(num): # 取出num中的子串
children = []
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
【参考答案】
代码参考
import os
import sys
pri_num = ['2', '3', '5', '7'] # 10以内的质数
def devision(num):
# 判断每一个数字
for i in num:
if i not in pri_num:
return 0
# 判断整个数字
n = int(num)
for i in range(2, int(n / 2)):
if n % i == 0:
return 0
return 1
def child(num): # 取出num中的子串
children = []
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
for num in range(2, 99999):
num = str(num)
d1 = devision(num)
d2 = child(num)
if d1 and int(d2) == 1:
maxnum = int(num)
print(maxnum)
结果为373
方法二
import os
import sys
z=[2,3,5,7]
def f(x):
for a in range(2,x):
if x % a ==0:
break
else:
return 1
list1=[]
for i in z:
for j in z:
for k in z:
new=i*100+j*10+k
new1=j*10+k
new2=i*10+j
if f(new1) and f(new2) and f(new):
list1.append(new)
print(max(list1))