web-dev-qa-db-ja.com

Python初心者向けループ(素数の検索)

私は本当に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が含まれていますが、これらはもちろん複合です。ループの動作を分解しようとしていますが、突然分割可能性のチェックをスキップする場所がわかりません。誰かが見てくれれば、構文がこれを引き起こしていることを私に説明できると思いました。本当にありがとう!

4
user2034140

私は実際にプログラムを次のように再構築します。

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の平方根まで反復するだけで済みます。一致しない場合、平方根の後に他の要素はなく、数は素数になります。

17
Volatility

コードには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ループバージョンと同じように機能します。 irange(2, n)の値に設定し、それぞれをチェックします。テストが失敗した場合は、チェックを停止して戻ります。範囲内のすべての数値に対してnをチェックし、いずれもnを均等に分割する場合、その数値は素数です。

繰り返しになりますが、これらすべてのトリックをすぐに学ぶ必要はありませんが、学ぶと楽しいと思います。

6
steveha

これは機能するはずで、もう少し最適化されています

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

プライム以外のものを見つけた後は、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回実行します。

1
tacaswell

スニペットを下に貼り付けたものと比較すると、どこが間違っていたかがわかります。

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
1
Guddu
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')
0
Ahsanul kabir

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という数が素数であることがわかりました。

0
Sonny Parlin

さらにいくつかの改善を行いましょう。

  1. 2が唯一の偶数の素数であることを知っているので、リストに2を追加し、3から始めて、2でチェックする数を増やします。
  2. 中間点を過ぎたら(上記のsqrt*の例を参照)、素数をテストする必要はありません。
  3. リストを使用して素数を追跡する場合、必要なのはそれらの素数で割るだけです。

私は自分のコードを書きました。上記の各項目により、コードの実行時間が約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    
0
Omid
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からチェックされます。解決策は必要ないと思います。

0
mayank
def is_prime(n):
    if n>=2:
        for i in range(2, n):
            if n%i == 0:
                return False
        return True
    else:
        return False

素数を見つけるには

0
John Haggin
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)
0
brilliant