2017-02-07 4 views
1

このプログラムは、与えられた入力以下のすべての素数のリストを作成します。素数ファインダ(複数回含む)

これで、リストが印刷されます。

私が最初にプログラムを設計するとき、それは番号2を含む、なぜ、私は=素数のリストを初期化し理解することができない[2] Iは2%2​​ == 0、

if n % x == 0: 
    is_prime = False 
ので、思ったので

is_primeからFalseに設定されます。しかし、それはそうではないようです。

forのループで私のrange()のロジックに何かが起こっていると確信しています。

私の質問は次のようなものです:毎回素数のリストに2が含まれているのはなぜですか?

import math 


limit = int(input("Enter a positive integer greater than 1: ")) 

while limit < 2: 
    limit = int(input("Error. Please enter a positive integer greater than 1: ")) 

primes = [] 

#Check all numbers n <= limit for primeness 
for n in range (2, limit + 1): 
    square_root = int(math.sqrt(n)) 
    is_prime = True 

    for x in range(2, (square_root + 1)): 
     if n % x == 0: 
      is_prime = False 

    if is_prime: 
     primes.append(n) 

#print all the primes 
print("The primes less than or equal to", limit, "are:") 
for num in primes: 
    print(num) 
+0

'is_prime = False'の後ろに' break'を追加することで、このコードを大幅に高速化することができます。 10,000を考えてみましょう。 10000%2をチェックしてからis_prime = falseに設定し、10000%3、10000%4などをチェックします。 – Keatinge

+3

2それ自体がプライムで、何が問題なのですか? – armnotstrong

答えて

1

あなたがn=2をテストするときには、第二for -loopを入力しないので、あなたはis_prime = Falseを設定していないので。

# Simplified test case: 
x = 2 
for idx in range(2, int(math.sqrt(x))+1): 
    print(idx) 

rangeは、このケースであるので、これはprint何もしません:range(2, 2)ので、ゼロの長さを有しています。あなたはすでにそれが素数ではありませんが分かった場合でも、すべての可能な約数で各番号をテスト

  • :ので、あなたのアプローチは本当に効率的ではありません


    注意。

  • あなたのテストで素数の倍数を排除するものではない:2が素数である場合、2のすべての倍数は、プライムすることができない、など

で述べた素数を見つけるための本当に素晴らしい機能があります。 Fastest way to list all primes below N - 私はそれには行かない。しかし、あなたが改善に興味を持っているなら、あなたは一見することができます。

関連する問題