蓝桥杯—超级质数python

蓝桥杯—超级质数python


文章目录

  • 蓝桥杯—超级质数python
  • 【问题描述】
  • 【解题思路】
      • 质数定义
      • 1.个位数中质数有 2,3,5,7
      • 2.判断该数中每一个数字是否为质数2,3,5,7
      • 3.判断该数是否为质数
      • 4.取出数字中的子串
  • 【参考答案】
    • 代码参考
    • 方法二

【问题描述】

如果一个质数 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))

你可能感兴趣的:(python,蓝桥杯,算法)