题目内容:
数字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
初始代码
这个代码思路很普通,先判断范围内的每一个数是否是素数。如果是素数,再判断其循环之后的各个数是否是素数,如果全部都是素数 ,count+1,如果有一个不是直接退出判断其他数。
提交时显示超出时间限制,只能通过一个样例。后面我对代码进行优化之后通过了所有样例。
import math
def is_primer(x): #筛选素数
for i in range(2, int(math.sqrt(x))+1):
if x % i == 0:
break
else:
return True
return False
n = int(raw_input())
count = 0
for x in range(2, n):
l = 0
tx = x
flag = 0
if is_primer(x):
while tx != 0: #记录当前素数的位数
tx /= 10
l += 1
#print x
flag = 1
temp = 0
init = x
while temp != init:
i = x / 10
j = x % 10
temp = j * (10 ** (l - 1)) + i
#print temp
if is_primer(temp):
flag = 1
x = temp
else :
flag = 0
break
if flag == 1:
count += 1
print count
优化代码
根据上述问题我又仔细想了一下,发现确实有很大的空间进行优化。
当元素的位数是两位以上时,如果其中有 0,2,4,5,6,8,不管这个元素是不是素数,经过循环后,0,2,4,5,6,8肯定会作为个位数,这样的数一定不是素数。可以直接跳过判断。优化后代码如下:
import math
def is_primer(x):
for i in range(2, int(math.sqrt(x))+1):
if x % i == 0:
return False
return True
n = input()
count = 0
for x in range(2, n):
s = str(x)
for i in s:
if i in ['0', '2', '4', '5','6', '8']:
break
else:
l = 0
tx = x
flag = 0
if is_primer(x):
t = str(x)
l = len(t)
if l == 1:
count += 1
else:
flag = 1
temp = 0
init = x
while temp != init:
i = x / 10
j = x % 10
temp = j * (10 ** (l - 1)) + i
if is_primer(temp):
flag = 1
x = temp
else :
flag = 0
break
if flag == 1:
count += 1
print count+2 # +2是因为当元素是一位数的时候把 2,5省略了,在这里要加上
PS
这里有一个使用数组处理的方法也比较好,和大家分享一下。
https://blog.csdn.net/u013216537/article/details/74852913