2

我一直在尝试解决项目欧拉问题 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

4 回答 4

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
于 2012-07-01T17:58:21.790 回答
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))
于 2012-07-01T18:27:44.677 回答
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
> 
于 2018-12-25T23:05:42.370 回答
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)
于 2016-09-15T17:44:02.803 回答