蓝桥杯—超级质数python

文章介绍了如何使用Python编程解决蓝桥杯竞赛中的超级质数问题。首先定义质数,然后通过检查每一位数字以及相邻数字组成的两位数和三位数是否为质数来判断是否为超级质数。最后给出了两种不同的代码实现方法来找出最大的超级质数。
摘要由CSDN通过智能技术生成

蓝桥杯—超级质数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))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值