2021第十二届蓝桥杯国赛B组纯质数

@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
这篇文章的内容可能会有一些不足之处和错误,希望大家在评论区多多提出意见,我也会积极改正积极交流,以后也会分享一些自己的学习经历,如果这篇文章对你有所帮助,请点个赞吧!谢谢鼓励!

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