确定整数是否为圆形素数

时间:2012-07-01 17:53:53

标签: python primes

我一直在尝试解决项目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不是素数。

4 个答案:

答案 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
>