@2021第十二届蓝桥杯国赛B组
纯质数【python】
题目描述:如果一个正整数只有 11和它本身两个约数,则称为一个质数(又称素数)。
前几个质数是:2,3,5,7,11,13,17,19,23,29,31,37,· · · 。
如果一个质数的所有十进制数位都是质数,我们称它为纯质数。
例如:2,3,5,7,23,37 都是纯质数,而11,13,17,19,29,31不是纯质数。当然 1,4,35也不是纯质数。
请问,在 1 到 20210605中,有多少个纯质数?
思路解析:
1.由于数据量太大,首先要寻找高效的判断素数算法
2.其次,判断纯质数要求对每一数位分离判断,选择怎样的分离方法更加高效
3.分离后对该位数进行判断,是否为质数
4.记录纯质数的个数
话不多说上代码!
质数判断函数
# -*- coding = utf-8 -*-
# @Time : 2021/6/11 10:36
# @Author :超
# @File : 判断纯质数.py
# @Software : PyCharm
def is_prime(x):
if (x == 2) or (x == 3):
return True
elif (x == 1):
return False
elif (x % 6 != 1) and (x % 6 != 5):
return False
for i in range(5, int(x ** 0.5)+1, 6):
if (x % i == 0) or (x % (i+2) == 0):
return False
return True
解法一:
对分离位数方法比较传统,利用while循环进行除数取余,判断各个位上的数字是否不等于2、3、5、7。若不等于即该数不符合要求,将c更新为0,跳出循环;若等于将该数除以十继续取余循环
num = 20210605
sum = 0
for i in range(1, num+1):
c = 1
if(is_prime(i) == True):
a = i
while(a > 0):
b = a % 10
if(b != 2 and b != 3 and b != 5 and b !=7):
c = 0
break
else:
b = b/10
if(c == 1):
sum += 1
print(sum)
但是,该方法耗时太长,不建议使用
方法二:
利用set函数创建一个集合用于分离各个位数,并且去重。但是,集合无法利用索引取出元素,故使用list方法将其转换成列表,再利用for循环进行判断
num = 20210605
sum = 0
for i in range(1, num+1):
p = 0
if(is_prime(i) == True):
s = list(set(str(i))) # 去重
x = len(s)
for m in range(x):
j = s[m]
if(j != '2' and j != '3' and j != '5' and j != '7'):
p = 1
break
if(p == 0):
sum = sum+1
print(sum)
注意:由索引取出列表里的数字,依旧为字符串类型,故判断时2、3、5、7要加 ''
运行结果如下:
纯质数共有:1903个
运行时间:83.5497765541 s
感谢:link
这篇文章的内容可能会有一些不足之处和错误,希望大家在评论区多多提出意见,我也会积极改正积极交流,以后也会分享一些自己的学习经历,如果这篇文章对你有所帮助,请点个赞吧!谢谢鼓励!