質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

2327閲覧

Ruby 1~100までの数字を素数で出す場合について

ARU_Wing

総合スコア13

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

1クリップ

投稿2016/03/15 14:00

編集2016/03/16 12:18

表題の件について、下記のようにコードを組んだのですが、実行結果が空白になるのです。。。
(2..n-1).each do |x|
if n % x == 0
false
end
上記のfalseが正常に動作していないかと思うのですが、このfalseを正常に動作させる方法はございますでしょうか?
※NCC1701様にご回答いただいた部分があり、当初の内容を変更しております。
numbers = []
100.times do |n|
if n < 2
next
end
(2..n-1).each do |x|
if n % x == 0
false
end
end
next(false)
numbers.push(n)
end
p numbers

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

next(false)

numbers.push(n)

nextがあるので,numbers.push(n)は実行されません。

投稿2016/03/15 14:08

NCC1701

総合スコア1680

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ARU_Wing

2016/03/15 14:12

となると、 next(false)後に一度endで終了し、その後、numbers.push(n)という感じでしょうか。
NCC1701

2016/03/15 15:45 編集

素数を求めるアルゴリズムを教えて欲しいわけではなく,それがうまくコード化できないという趣旨ですよね。なので,掲載されたコードがどのような意味になってるかをお伝えします。 if n < 2 next end は 2未満は無視して次の数値の計算に進む(これは思惑通りだと思います。) if n % x == 0 && n >= x false end は 1. nがxで割り切れ,かつnはx以上であるとき, 2. falseという式を評価する ことになってます。 1.についてはループが(2..n-1)なのでn >= x はどんなときも真になります。if n % x == 0だけと全く同じ意味になってます。 2.は別の制御をしたいのでは?(なんとなく予測はつきますが) (http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fcontrol.html) 要するに「因数が見つかったときに,何をしたいのか」のコードがないので,素数を追加していけていません。 それとstepというメソッドもあります。timesより効率よく素数を求めるループを作る工夫も試してみてください。
ARU_Wing

2016/03/16 11:28

ご回答ありがとうございます! この場合ですとfalseが何の意味もなく、このfalseを動かすことができれば、 実行できると考えたのですが、この考えは間違いでしょうか?
NCC1701

2016/03/16 15:22

If n % x == 0 が真になるということは、nが素数でないことが判明したときですね。とすると(2..n-1).eachの残りのループは実行しなくてもよい状態です。 なので、falseの行はfalseではなくループを抜けるコマンドが必要です。 次に、現状のコードだとnが素数と判明してもしなくても、next(false)を実行してnumbers.push(n)は実行されないことになります。 なので素数であるときとそうで無いときとを区別してnumber.pushが実行される工夫が必要です。 完成までもう一息ですね
ARU_Wing

2016/03/19 01:29

ここまでお付き合いいただきありがとうございます! timesより効率よく素数を求めるループを作る工夫も試してみてください。  →上記についてもどんどん考えていきます!!
guest

0

質問文のコードを少し変更して動作するようにしてみました。

ruby

1numbers = [] 2100.times do |n| 3 if n < 2 4 next 5 end 6 7 prime = true # <=== 8 (2..n - 1).each do |x| 9 if n % x == 0 10 prime = false # <=== 11 end 12 end 13 if prime # <=== 14 numbers.push(n) 15 end 16end 17 18p numbers

<=== としてあるのが変更した行です。

このコードを、さらに変更したのが次のものです。

ruby

1# nが素数なら true を返す,そうでなければ false を返す。 2# (n は 2 以上であること) 3def prime?(n) 4 (2..n - 1).each do |x| 5 return false if n % x == 0 6 end 7 true 8end 9 10numbers = [2] 11(3..100).each do |n| 12 numbers.push(n) if prime?(n) 13end 14 15p numbers

どちらも実行結果は次のようになります。

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

もっと変更できる点はいろいろあります。
偶数は素数でないのはあきらかなので処理をスキップするとか、
割り算を試すのは n - 1 まででなく sqrt(n) までで十分だとか,
既にみつけた素数で割り算すれば十分だとか ...

投稿2016/03/17 11:16

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問