2017-12-18 1 views
1

私はここでエラトステネスの篩を取得しようとしていますが、コードは元のリストを返し続けます。何が悪いのか分かりません。貧しい初心者の助けを借りてください。そして、あらかじめ大変ありがとうございます!この文product私はPythonでEratosthenesの篩を作成しようとしていますが、プログラムは元の入力を返します。なにが問題ですか?

def main(): 
    cupcake = [] 
    i = 0 
    for i in range(1, 101): 
     cupcake += [i] 
    cupcake.remove(1) 
    cupcake.insert(0, 0) 
    for j in range(len(cupcake)): 
     if cupcake[j] > 0: 
      for k in range(len(cupcake)): 
       if cupcake[k] > 0: 
        product = int(cupcake[k])/int(cupcake[j]) 
        if (type(product) is int) == True: 
         if product == 1: 
          continue 
         cupcake.remove(cupcake[k]) 
         cupcake.insert((k-1), 0) 
    print(cupcake) 
+0

これをチェックhttps://stackoverflow.com/questions/3939660/sieve-of-eratosthenes-finding-素数 - python – laguittemh

答えて

1
product = int(cupcake[k])/int(cupcake[j]) 

常にそれが全体数(2.0、...)であっても、浮動小数点値になります。したがって、それ以降のステートメントは常にfalseを返します。あなたはfloat.is_integer()機能を使用しています

if product.is_integer(): 

if (type(product) is int) == True: 

から後のステートメントを変更する必要があります。

+0

私はこれを知らなかった。ありがとうRobin !!! –

+2

upvoteまたは受け入れられた答えは十分にありがたい;) – Robin

0

私はそのようにそれを記述しないだろうが、ここに私の改善提案はあなたのコードのために行く:

def main(): 
    cupcake = [i for i in range(101)] 
    cupcake.remove(0) 
    cupcake.remove(1) 
    for j in cupcake: 
     if j > 0: 
      for k in cupcake: 
       if k > j and k % j == 0: 
        cupcake.remove(k) 
    print(cupcake) 

main() 
+0

これは短いです。これを実験していきます。ありがとうVeltz! –

0

とても非効率的であること:

  • 一度に初期リスト1の要素を構築リストの理解が1つの操作でそれを行う場合:cupcake = i for i in range(1, 101)またはカップケーキ=リスト(範囲(1,101))
  • あなたは値を変更するためにアンチパターンremove + insertを使用しますjおよびkの初めからcupcake[0] = 0以降コードでcupcake[k] = 0
  • もしループ、第二のループは、J + 1
  • で始めることができるときに使用すべきときに(誤って)分割を使用する:リストの要素の

    >>> 4/2 
    2.0 
    >>> type(4/2) 
    float 
    

    だからあなたのコードになる可能性:剰余

そして、あなたの本当の問題は、Python 3には、二つの整数の割り算は、フロートが1であるかどうかを常にある、または他の倍数ではないということです:

def main(): 
    cupcake = list(range(1, 101)) 
    cupcake[0] = 0 
    for j in range(len(cupcake)): 
     if cupcake[j] > 0: 
      for k in range(j+1, len(cupcake)): 
       if cupcake[k] > 0: 
        if cupcake[k] % cupcake[j] == 0: 
         cupcake[k] = 0 
    print(cupcake) 

とにかく、正しいALGOではなく、一貫割り切れるのテストの倍数を削除することです:

def main(): 
    cupcake = list(range(1, 101)) 
    cupcake[0] = 0 
    for j in range(len(cupcake)): 
     if cupcake[j] > 0: 
      for k in range(j + cupcake[j], len(cupcake), cupcake[j]): 
         cupcake[k] = 0 
    print(cupcake) 
+0

こんにちはSerge-ありがとうございます。うわー、私はそんなに短い方法があるとは思っていませんでした。私は私の最初のコーディング演習で自分の道をつくっています。いつかあなたと同じくらい良いことを願っています^^ –

関連する問題