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つのサンプルのみです.コードを最適化した後、すべてのサンプルに合格しました.
最適化コード
上記の問題に基づいて私はまたよく考えてみると、確かに大きな空間が最適化されていることがわかりました.要素の桁数が2桁以上の場合、その中に0,2,4,5,6,8があれば、この要素が素数であるかどうかにかかわらず、ループ後、0,2,4,5,6,8が必ず桁数となり、このような数は素数ではないに違いない.直接判断をスキップできます.最適化後のコードは次のとおりです.
PS
ここでは配列処理を使う方法もあるので、皆さんと共有してみましょう.https://blog.csdn.net/u013216537/article/details/74852913
数字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