蓝桥杯寒假刷题Python:超级质数

问题描述

如果一个质数 P 的每位数字都是质数, 而且每两个相邻的数字组成的两位 数是质数, 而且每三位相邻的数字组成的三位数是质数, 依次类推, 如果每相 邻的 k 位数字组成的 k 位数都是质数, 则 P 称为超级质数。

如果把超级质数 P 看成一个字符串, 则这个超级质数的每个子串都是质数。

例如, 53 是一个超级质数。

请问, 最大的超级质数是多少?

答案提交

这是一道结果填空的题, 你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。

思路

题目表达了两点要求:

1.该数字必须是质数,并且每一位都是质数

2.该数字的所有子串都必须是质数

思路借鉴自 CSDN博主「尐镇做题家」,原文链接:https://blog.csdn.net/qq_32468603/article/details/128674658

代码分析:

  1. 首先定义一个函数,实现第一个要求。次函数内又分为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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值