Pythonサイクル素数

6092 ワード

タイトル内容:
数字197は、197の3桁の循環シフト後の数字:197971719がすべて素数であるため、循環素数と呼ぶことができる.100以内の数字は13個,2,3,5,7,11,13,17,31,37,71,73,79,97を含む.任意の正の整数n以内に合計何個のこのような循環素数が要求される.
入力形式:
正の整数n.
出力フォーマット:
n以内のサイクル素数の数.
サンプルを入力:
100
出力サンプル:
13
イニシャルコード
このコードの考え方は普通で,まず範囲内の各数が素数であるかどうかを判断する.素数であれば,そのループ後の各数が素数であるか否かを判断し,すべてが素数であればcount+1,1つが直接終了しなければ他の数を判断する.コミット時に時間制限を超えて表示されるのは、1つのサンプルのみです.コードを最適化した後、すべてのサンプルに合格しました.

import math

def is_primer(x):    #    
    for i in range(2, int(math.sqrt(x))+1):
        if x % i == 0:
            break
    else:
        return True
    return False

n = int(raw_input())
count = 0
for x in range(2, n):
    l = 0
    tx = x
    flag = 0
    if is_primer(x):
        while tx != 0:  #         
        tx /= 10
        l += 1
        #print x
        flag = 1
        temp = 0
        init = x
        while temp != init:
            i = x / 10
            j = x % 10
            temp = j * (10 ** (l - 1)) + i
            #print temp

            if is_primer(temp):
                flag = 1
                x = temp
            else :
                flag = 0
                break

        if flag == 1:
            count += 1
print count   

最適化コード
上記の問題に基づいて私はまたよく考えてみると、確かに大きな空間が最適化されていることがわかりました.要素の桁数が2桁以上の場合、その中に0,2,4,5,6,8があれば、この要素が素数であるかどうかにかかわらず、ループ後、0,2,4,5,6,8が必ず桁数となり、このような数は素数ではないに違いない.直接判断をスキップできます.最適化後のコードは次のとおりです.
import math

def is_primer(x):    
    for i in range(2, int(math.sqrt(x))+1):
        if x % i == 0:
            return False
    return True

n = input()

count = 0
for x in range(2, n):
    s = str(x)
    for i in s:
        if i in ['0', '2', '4', '5','6', '8']:
            break
    else:
        l = 0
        tx = x
        flag = 0

        if is_primer(x):
            t = str(x)
            l = len(t)
            if l == 1:
                count += 1
            else:
                flag = 1
                temp = 0
                init = x
                while temp != init:
                    i = x / 10
                    j = x % 10
                    temp = j * (10 ** (l - 1)) + i

                    if is_primer(temp):
                        flag = 1
                        x = temp
                    else :
                        flag = 0
                        break
            if flag == 1:
                count += 1
print count+2  # +2               2,5   ,      


PS
ここでは配列処理を使う方法もあるので、皆さんと共有してみましょう.https://blog.csdn.net/u013216537/article/details/74852913