私は本当にpythonの初心者なので、知識が不足していることをお詫びしますが、私が尋ねている理由は、Pythonマニュアルとチュートリアルを読んでいるからです( http://docs.python.org/2.7/tutorial )ループがどのように機能するかを完全に理解することはできません。いくつかの簡単なプログラムを書いたので、基本は理解できたと思いますが、 n以下のすべての素数をリストすることを目的としたこのプログラムが機能しない理由は何でも:
n = int(raw_input("What number should I go up to? "))
p = 2
while p <= n:
for i in range(2, p):
if p%i == 0:
p=p+1
print "%s" % p,
p=p+1
print "Done"
たとえば、100を入力したときの出力は次のとおりです。
2 3 5 7 11 13 17 19 23 27 29 31 35 37 41 43 47 53 59 61 67 71 73 79 83 87 89 95 97 101 Done
これはほぼ正しいように見えますが、何らかの理由で27、35、95が含まれていますが、これらはもちろん複合です。ループの動作を分解しようとしていますが、突然分割可能性のチェックをスキップする場所がわかりません。誰かが見てくれれば、構文がこれを引き起こしていることを私に説明できると思いました。本当にありがとう!
私は実際にプログラムを次のように再構築します。
for p in range(2, n+1):
for i in range(2, p):
if p % i == 0:
break
else:
print p,
print 'Done'
これはおそらくより慣用的な解決策であり(for
ループの代わりにwhile
ループを使用)、完全に機能します。
外側のfor
ループは、2からn
までのすべての数値を繰り返し処理します。
内側の数値は、2からp
までのすべての数値を繰り返し処理します。 p
に均等に分割される数に達すると、内部ループから抜け出します。
else
ブロックは、forループが分割されない(素数を出力する)たびに実行されます。
次に、プログラムは終了後に'Done'
を出力します。
補足として、各因子にはペアがあるため、2からp
の平方根まで反復するだけで済みます。一致しない場合、平方根の後に他の要素はなく、数は素数になります。
コードには2つのループがあり、1つは別のループの中にあります。内部ループを関数に置き換えると、コードを理解するのに役立ちます。次に、関数が正しく、独立できることを確認します(外側のループとは別に)。
これがあなたの元のコードの私の書き直しです。この書き換えは完全に機能します。
_def is_prime(n):
i = 2
while i < n:
if n%i == 0:
return False
i += 1
return True
n = int(raw_input("What number should I go up to? "))
p = 2
while p <= n:
if is_prime(p):
print p,
p=p+1
print "Done"
_
is_prime()
は外側のループのループインデックスには触れないことに注意してください。これはスタンドアロンの純粋関数です。内側のループ内でp
をインクリメントすることが問題であり、この分解されたバージョンには問題がありません。
これで、for
ループを使用して簡単に書き直すことができ、コードが改善されたと思います。
_def is_prime(n):
for i in range(2, n):
if n%i == 0:
return False
return True
n = int(raw_input("What number should I go up to? "))
for p in range(2, n+1):
if is_prime(p):
print p,
print "Done"
_
Pythonでは、range()
に渡した上限が含まれないことに注意してください。したがって、_< n
_をチェックする内部ループでは、単にrange(2, n)
を呼び出すことができます。 _<= n
_が必要な外部ループでは、n
に1を追加して、n
が含まれるようにする必要があります:range(2, n+1)
Pythonには、楽しい組み込みのものがいくつかあります。これらすべてのトリックをすぐに学ぶ必要はありませんが、is_prime()
を書くことができる別の方法があります。
_def is_prime(n):
return not any(n%i == 0 for i in range(2, n))
_
これは、is_prime()
のfor
ループバージョンと同じように機能します。 i
をrange(2, n)
の値に設定し、それぞれをチェックします。テストが失敗した場合は、チェックを停止して戻ります。範囲内のすべての数値に対してn
をチェックし、いずれもがn
を均等に分割する場合、その数値は素数です。
繰り返しになりますが、これらすべてのトリックをすぐに学ぶ必要はありませんが、学ぶと楽しいと思います。
これは機能するはずで、もう少し最適化されています
import math
for i in range(2, 99):
is_prime = True
for j in range(2, int(math.sqrt(i)+1)):
if i % j == 0:
is_prime = False
if is_prime:
print(i)
プライム以外のものを見つけた後は、i
ループを再開しません。
p = i = 2
while p <= n:
i = 2
while i < p:
if p%i == 0:
p += 1
i = 1
i += 1
print p,
p += 1
print "Done"
while
ループは本体を実行し、上部の条件がTrue
であるかどうかを確認し、trueの場合は、本体を再度実行します。 for
ループは、イテレータ内のアイテムごとに本体を1回実行します。
スニペットを下に貼り付けたものと比較すると、どこが間違っていたかがわかります。
n = int(raw_input("What number should I go up to? "))
p = 2
while p <= n:
is_prime=True
for i in range(2, p):
if p%i == 0:
is_prime=False
break;
if is_prime==True:
print "%d is a Prime Number\n" % p
p=p+1
print('Enter a Number: ')
number=abs(int(input()))
my_List=[0,1]
def is_prime(n):
if n in my_List:
return True
Elif n>=2:
for i in range(2, n):
if n%i == 0:
return False
return True
else:
return False
if is_prime(number):
print("%d is Prime!"%number)
else:
print(number,'is not prime')
Python 3の最適化を念頭に置いたより広範な例を次に示します。
import sys
inner_loop_iterations: int = 0
def is_prime(n):
a: int = 2
global inner_loop_iterations
if n == 1:
return("Not prime")
Elif n == 2:
return("Prime")
while a * a <= n + 1:
inner_loop_iterations += 1
# This if statement reduces the number of inner loop iterations by roughy 50%
# just weeding out the even numbers.
if a % 2 == 0:
a += 1
else:
a += 2
if n % 2 == 0 or n % a == 0:
return ("Not prime")
else:
return ("Prime")
while True:
sys.stdout.write("Enter number to see if it's prime ('q' to quit): ")
n = input()
if not n:
continue
if n == 'q':
break
try:
n = int(n)
except ValueError:
print("Please enter a valid number")
if n < 1:
print("Please enter a valid number")
continue
sys.stdout.write("{}\n".format(is_prime(n)))
sys.stderr.write("Inner loops: {}\n\n".format(inner_loop_iterations))
inner_loop_iterations=0
このプログラムには2つの主要な最適化があります。最初は、2からnの平方根までのみ反復し、奇数のみを反復します。これらの最適化を使用して、15811回のループ反復で1000000007という数が素数であることがわかりました。
さらにいくつかの改善を行いましょう。
sqrt
と*
の例を参照)、素数をテストする必要はありません。私は自分のコードを書きました。上記の各項目により、コードの実行時間が約500%向上します。
prime_list=[2]
def is_prime(a_num):
for i in prime_list:
div, rem = divmod(a_num, i)
if rem == 0:
return False
Elif div < i:
break;
prime_list.append(a_num)
return True
for i in range(2, p):
if p%i == 0:
p=p+1
print "%s" % p,
p=p+1
私はあなたのエラーだけを伝えます、3行目であなたはpをインクリメントしていますが、実際にはあなたが欠けているのはあなたのiです前の場合のあなたのiが13と言われるとそれは13の後にあなたのループをチェックしますが、5,7,11なので、エラーです。27の場合に27が13になる前にiが発生し、14からチェックされます。解決策は必要ないと思います。
def is_prime(n):
if n>=2:
for i in range(2, n):
if n%i == 0:
return False
return True
else:
return False
素数を見つけるには
def findprime(num):
count = 0
for i in range(1,num+1):
list1 = []
for ch in range(1,i+1):
if i%1==0 and i%ch==0:
list1.append(ch)
if len(list1)==2:
count += 1
print(i,end=", ")
print()
return count
num2 = int(input("enter a number: "))
result=findprime(num2)
print("prime numbers between 1 and",num2,"are",result)