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 のように循環しているかどうかを正しく識別しますが、119 が素数ではないため、循環ではない 191 などの一部の非循環素数も循環として識別します。

4

4 に答える 4

3

return True1回転した後なので、すべての円素数をチェックするわけではありません。次のように変更する必要があります。

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 に答える