• 締切済み

rubyのプログラムについて

rubyのプログラムで2~1000までの素数を列挙のものなんですがどこか違ってますか汗 考えたんですがよくわからなくて汗すみませんどなたかお願いします i=2 print "素数は\n" while i<=1000 do warukazu=2 flag=0 while warukazu<i do if i%warukazu==0 then flag=flag+1 warukazu=warukazu+1 else warukazu=warukazu+1 end end if (flag==0) then print i print"\n" end i=i+1 end

みんなの回答

回答No.2

こちらで実行した所、ちゃんと(1000以下の)168個の素数が表示されましたが もしかして"invalid multibyte char"系のエラーが出てたりしますか? そのエラーの場合、原因は「素数は」という部分なので、 print "primes:\n" か何かに書き換えてあげて下さい。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

機能自体は間違いではありません。 効率とかを考えると、修正した方がいい箇所はあります。 flag=flag+1 ・約数の数を数えるのなら、有効ですが、実際には、あるか無いか、の判断にしか使っていません。 それならflag=1で十分です。 ・また、同様に全ての約数を求めるなら有効ですが、単に素数かどうかの判定だけなら、一つでも約数が存在した時点で、他の約数を検討する必要がありません。breakでwhile warukazu<i doのループから抜けていいはずです。 warukazu ・この方法の場合、2以外の偶数で割るのは、無駄です。 偶数で割り切れる=元の数は偶数=2の倍数 ですから。 ・また、 warukazu * warukazu >= i のときに判定するのは無駄です。 flag=flag+1 warukazu=warukazu+1 i=i+1 これらは、同じような計算していますが、左辺にも右辺にも同じ変数を使っています。 こういうときは、 += を使うと、1回だけ書けばいいので、楽ですし、入力間違い( warukazu=wanukazu+1 とか)も防げます アルゴリズム。 素数判定にはいろんな方法があります。 今回のような一覧表を作るなら、「ふるい」という方法があります。