🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Q&A

解決済

1回答

1877閲覧

Rubyでの素数判定プログラム

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

0グッド

0クリップ

投稿2020/11/29 08:46

編集2020/11/30 00:52

前提・実現したいこと

プログラミングの勉強を始めて二日の者です。
rubyでprimeを使わず素数判定をするプログラムを書こうとしています。
正しく動かないので、私の理解できるように改善方法を提案していただきたいです。

発生している問題・エラーメッセージ

ターミナルで実行したところどんな値を与えても「false」と返ってくるようになりました。

該当のソースコード

Ruby

1puts "値を入力" 2i = gets.chomp.to_i 3result = 0 4 5if i = 1 || i = 0 || 6 judge = 1 7 8else 9 while result == 0 10 (2..i-1).each do |num| 11 result += i % num 12 end 13 end 14end 15 16if judge == 0 17 puts "true" 18else 19 puts "false" 20end 21

試したこと

知識が浅くネットで見つけたコードを見ても理解ができません。

補足情報(FW/ツールのバージョンなど)

win10でRuby 2.6.6p146を動かしています

###追記2

Ruby

1puts "値を入力" 2i = gets.chomp.to_i 3 4if i == 0 || i == 1 5 puts "false" 6 7elsif i == 2 8 puts "true" 9 10else 11 (2..i - 1).each do |num| 12 if 0 == i % num 13 puts "false" 14 break 15 16 elsif num == i - 1 17 puts "true" 18 break 19 20 else 21 end 22 end 23end 24

追記

Ruby

1puts "値を入力" 2i = gets.chomp.to_i 3 4if i == 0 || i == 1 || i == 2 5 puts "false" 6 7else 8 (2..i - 1).each do |num| 9 if 0 == i % num 10 puts "false" 11 break 12 13 else 14 puts "true" 15 break 16 end 17 end 18end 19

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

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

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

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

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

guest

回答1

0

ベストアンサー

if i = 1 || i = 0 || i = 2

i1を比較するならi == 1です。i = 1なら代入です。

while result == 0

(2..i-1).each do |num| result += i % num end

end

何をしたいのは不明です。judgeは設定しなくて良いのでしょうk?

#回答例
修正が完了したようなので、回答例を載せておきます。
その1:元の形を残した物。

Ruby

1def is_prime?(i) 2 if i < 2 3 return false 4 else 5 (2...i).each do |num| 6 if i % num == 0 7 return false 8 end 9 end 10 return true 11 end 12end 13 14print "値を入力? " 15i = gets.chomp.to_i 16puts is_prime?(i)

その2:便利なメソッドを使った物。

Ruby

1def is_prime?(i) 2 (2...i).all?{ |n| i % n != 0 } 3end 4 5print "値を入力? " 6i = gets.chomp.to_i 7puts is_prime?(i)

除数はi未満でなくiの平方根未満で良いとか、2以外の偶数で割らなくても良いとか、速度向上策はいろいろありますが、それはRubyの話じゃなくて数学の話なので、割愛します。

投稿2020/11/29 08:57

編集2020/11/30 01:06
otn

総合スコア85882

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

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

退会済みユーザー

退会済みユーザー

2020/11/29 09:15

== に修正しました、ありがとうございます。 resultが1でなくなった時にjudgeに1を加えるにはどう書き換えればいいですかね?
otn

2020/11/29 09:24

> resultが1でなくなった時にjudgeに1を加えるにはどう書き換えればいいですかね? それ自体意味不明ですが、上記日本語をRubyで書くと、 if result != 1 judge = 1 end まずは、素数をどうやって判定するか、日本語で書いてみましょう。 それが正しく書けないとプログラムも書けません。
退会済みユーザー

退会済みユーザー

2020/11/29 09:40

すみませんでした。 入力された値が0,1,2では無い場合に、確実に割れる1、またその値を除いた「2..i-1」でループ処理 「2..i-1」のそれぞれの数で入力された値を割り、余りが出たらresultに余りを足し「2.i-1」の処理そのものを終わらせる(つまり2から約数未満の数でiを割り、1つでも割れるものがあれば割るのを止める) 最後までループ処理が終わらなかったiは素数であり、judgeは0のままで最後の分岐処理でtrueが出力される という考えでした。
退会済みユーザー

退会済みユーザー

2020/11/29 09:46

2から約数未満は、2からi未満の誤字です
otn

2020/11/29 09:53

> 2から約数未満の数でiを割り、1つでも割れるものがあれば割るのを止める > 最後までループ処理が終わらなかったiは素数であり、 だけでいいです。 「余りが出たらresultに余りを足し」が無意味です。
退会済みユーザー

退会済みユーザー

2020/11/29 10:17

説明ありがとうございます。 実行し正しく動作したコードを追記しました。 もしよろしければ、~~するclassを作るなどの、基礎的な文法だけでこのプログラムを効率的に書く方法を教えていただけないでしょうか。
otn

2020/11/29 11:42

> 実行し正しく動作したコードを追記しました。 惜しいです。10までの数値を全部確認しましたか?
退会済みユーザー

退会済みユーザー

2020/11/29 13:26

確認したら1以外の奇数のべき数はtrueになるようでした。 まったく原因がわからないので教えて頂きたいです。
otn

2020/11/29 14:29

今のプログラムは、 「2で割り切れたら素数でない。2で割り切れなかったら素数」 です。
退会済みユーザー

退会済みユーザー

2020/11/29 23:29

なるほど、2で割り切れなかった時点でbreakしてしまっていたから、breakするのを計算が終わってからにする必要があったんですね。 追記しましたがこれで正しいでしょうか?
otn

2020/11/30 00:27

はい。2は素数であるのに素数で無いと判断しているという点を除いては正しい動作だと思います。 あとで、改善例を載せておきます。
退会済みユーザー

退会済みユーザー

2020/11/30 00:46

なぜか素数でないと思い違いをしていました。 親切に回答して頂きありがとうございました。
otn

2020/11/30 02:24

これだけのヒントで正常プログラムに到達できたと言うことは、最初から真剣に考えていれば自力で到達できていた気がします。
退会済みユーザー

退会済みユーザー

2020/11/30 05:27

勿論真剣に考えたり、資料を探したりしていたのですが、コードを見てどこが間違いなのかを考察する力が足りないのだと思います。 また、質問サイトでの苦い経験から一つの回答で限界まで自力で進むよう気を付けているのもあると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問