2012-07-01 2 views
2

Я пытался решить проблему эйлера проекта 35, и мне нужно сделать функцию, которая скажет мне, является ли целое число круговым простым. У меня есть стандартная функция isprime и функция, которая дает список поворота цифр. Мой поворот код и iscircularprime код здесь:iscircularprime function in python

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 не является простым. Я не вижу, что не так с моей функцией iscircularprime, было интересно, есть ли у кого-нибудь идеи?

ответ

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 
+0

Ах это полезно, должно быть хорошо завершая проблему, благодарю за помощь –

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)) 
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)