最近在MOOC上学习Python,遇到一个求解循环素数的问题,现在来整理一下↓
题目描述
数字197可以被称为循环素数,因为197的三个数位循环移位后的数字:197,971,719均为素数。100以内这样的数字包括13个,2,3,5,7,11,13,17,31,37,71,73,79,97。要求任意正整数n以内一共有多少个这样的循环素数。
输入描述:
一个正整数n。
输出描述:
n以内循环素数的数目。
输入例子:
100
输出例子:
13
题目分析
- 我觉得这个问题最耗时间的地方在于素数的判断。最开始我采用暴力法求解素数,在n的数量级比较小的时候,这个方法还可以用,但是当n的数量级变大时,就相当耗时了。需要对此做出优化。
- 优化过程:
- ①当0,2,4,5,6,8排在个位数时,如果不是10以内的数,就肯定不是素数。因此,只有1,3,7,9这四个数组成的组合数才有可能是循环素数。可以根据这个条件剔除数字中含有0,2,4,5,6,8的数。
- ②这样循环的步长可以由原来的加1变成加2,即只判断奇数即可。
题目代码
暴力法:
import math
def isPrime(num):
for i in range(2,int(math.sqrt(num)+1)):
if num%i==0:
return False
return True
n=input()
count=0
for k in range(2,n):
if isPrime(k):
t_str=str(k)
t_len=len(t_str)
if t_len==1:
count+=1
else:
for t in range(1,t_len):
t_str=t_str[1:]+t_str[0]
tmp=int(t_str)
if not isPrime(tmp):
break
else:
count+=1
print count
优化后:
import math
def isPrime(num):
for i in range(3,int(math.sqrt(num)+1),2):
if not num%i:
return False
else:
return True
n=input()
numList = [2,3,5,7]
for num in range(11,n):
for s in str(num):
if s in ['0','2','4','5','6','8']:
break
else:
if isPrime(num):
t_str=str(num)
t_len=len(t_str)
for t in range(1,t_len):
t_str=t_str[1:]+t_str[0]
tmp=int(t_str)
if not isPrime(tmp):
break
else:
numList.append(tmp)
print(len(numList))
相关参考