题目链接:https://www.lanqiao.cn/problems/2382/learning/?contest_id=82
思路
- 要求质数,首先默写一个判断是否是质数的最佳复杂度函数
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
- 再仔细审题,发现这是还是一个滑动窗口题,比如一串数字12345,那么要滑动
判断以下数字子串是否都是质数,如果有一个不是质数则跳过当前数字12345
整体代码:
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最大,数字越大符合超级质数的概率越小
总结
这个题灵活运用了求质数和实现滑动窗口的两个算法 结合起来还是有点难度的