【蓝桥OJ】超级质数 Python

题目链接:https://www.lanqiao.cn/problems/2382/learning/?contest_id=82
【蓝桥OJ】超级质数 Python_第1张图片

思路

  1. 要求质数,首先默写一个判断是否是质数的最佳复杂度函数 def isPirme(n),详见【Python3算法竞赛必备工具】笔记第22条
    即:
def isPirme(n):
    if(n<=3):
        return n>1
    if(n%6!=1 and n%6!=5):
        return False
    for i in range(5,int(sqrt(n))+1,6):
        if (n%i==0 or n%(i+2)==0):
            return False
    return True
  1. 再仔细审题,发现这是还是一个滑动窗口题,比如一串数字12345,那么要滑动
    判断以下数字子串是否都是质数,如果有一个不是质数则跳过当前数字12345

【蓝桥OJ】超级质数 Python_第2张图片

整体代码:

from math import sqrt

def isPirme(n):
    if(n<=3):
        return n>1
    if(n%6!=1 and n%6!=5):
        return False
    for i in range(5,int(sqrt(n))+1,6):
        if (n%i==0 or n%(i+2)==0):
            return False
    return True

for k in range(2,1000000):
    i,j=0,0  
    f=1
    l=list(str(k))
    for i in range(len(l)):  #双指针滑动窗口的过程
        for j in range(i+1,len(l)+1):
            # print(''.join(l[i:j]))
            if not isPirme(int(''.join(l[i:j]))):
                f=0   #有一个不是质数就剪枝
            if f==0:break
        if f==0:break
    if f==0:continue
    else:print(k)  #运行到1000000仍然只有373最大,数字越大符合超级质数的概率越小

总结

这个题灵活运用了求质数和实现滑动窗口的两个算法 结合起来还是有点难度的

你可能感兴趣的:(python脚本,算法,python,开发语言,算法)