数字197可以被称为循环素数,因为197的三个数位循环移位后的数字:197,971,719均为素数。100以内这样的数字包括13个,2,3,5,7,11,13,17,31,37,71,73,79,97。要求任意正整数n以内一共有多少个这样的循环素数。
循环移位方法
- 字符串切片
判断循环素数的优化
- 范围为2-sqrt(n)
- 判断一个n位数是否是循环素数的过程相当于判断n个数是否是循环素数的过程。只需判断其中一个数(取最小数)是否是循环素数。
- 含有0,2,4,5,6,8(除个位数)的数一定不是循环素数
import math
def is_prime(x):
flag = True
for i in range(2, int(math.sqrt(x))+1):
if x % i == 0:
flag = False
break
return flag
def first_min(my_str):
flag = True
s = my_str
for i in range(1, len(my_str)):
s = rev_str(s)
if int(s) < int(my_str):
flag = False
break
return flag
def rev_str(my_str):
length = len(my_str)
my_str = my_str[1:length] + my_str[0]
return my_str
n = int(input())
count = 0
for j in range(1, n):
if j == 2:
count += 1
if j == 3:
count += 1
if j == 5:
count += 1
if j == 7:
count += 1
if j > 10:
str_ = str(j)
for m in str_:
if m in ['0', '2', '4', '5', '6', '8']:
break
else:
judge = 0
if first_min(str_):
jx = j
for k in range(0, len(str_)):
if is_prime(jx):
if jx < n:
judge += 1
else:
judge = 0
break
rev = rev_str(str_)
if str_ != rev:
str_ = rev
jx = int(str_)
else:
break
count += judge
print(count)