我一直在尝试解决项目euler问题35,并且需要创建一个函数来告诉我整数是否是循环素数。我有一个标准的isprime
函数和一个函数来给出一个数字旋转列表。我的轮播代码和iscircularprime
代码在此处:
def rotate(n):
rotlist = []
m = str(n)
counter = 0
while counter < len(str(n)):
m = m[1:] + m[0]
rotlist.append(int(m))
counter += 1
return rotlist
def iscircularprime(n):
np = [0,2,4,5,6,8]
y = str(n)
for j in y:
if int(j) in np:
return False
if isprime(n)==False:
return False
m = rotate(n)
for i in m:
if isprime(i)==True:
return True
else:
return False
我没有包含我的isprime
功能,因为它是相当标准的。我的函数将正确识别素数是否为圆形,如197所示,但也会将一些非圆形素数识别为圆形,例如191,这不是圆形的,因为119不是素数。
答案 0 :(得分:3)
一次轮换后你return True
,所以你不检查所有圆形素数。你应该把它改成:
def iscircularprime(n):
np = [0,2,4,5,6,8]
y = str(n)
for j in y:
if int(j) in np:
return False
if isprime(n)==False:
return False
m = rotate(n)
# new code here
is_circ_prime = True
for i in m:
if not isprime(i):
is_circ_prime = False
return is_circ_prime
答案 1 :(得分:0)
未经测试,但我认为这是我多年前解决的问题。
最简单的方法是快速帮助:
from collections import deque
def shifter(num):
strnum = deque(str(num))
for i in xrange(len(strnum)):
yield int(''.join(strnum))
strnum.rotate()
然后:
sum(1 for i in xrange(1000000) if all(is_prime(p) for p in shifter(i))
答案 2 :(得分:0)
这是一个循环任何数字的函数:
def circulate_number(A):
for v in range(len(str(A))):
a , i , s = str(A), len(str(A)), ''
for c in range(i):
s += str(a[(v+c) % i])
print(s)
v+= 1
circulate_number(123456)
答案 3 :(得分:0)
强制性的单线解决方案。语句的左侧是素数检查器,右侧是旋转发生器:
from math import factorial as f
def is_circular_prime(n):
return (lambda s: all(f(i - 1) % i == i - 1 for i in (int(s[j:] + s[:j]) for j in range(len(s)))))(str(n))
for number in range(2, 10000):
if is_circular_prime(number):
print(number)
输出
> python3 test.py
2
3
5
7
11
13
17
31
37
71
73
79
97
113
131
197
199
311
337
373
719
733
919
971
991
1193
1931
3119
3779
7793
7937
9311
9377
>