##はじめに
この記事は「たのしいRuby 第6版」の練習問題の一つを解いたものです。解答はすでにweb上に存在しますが、自分が何を考えてコードを書いたかを含めて解説していきます。
##問題
整数numが素数であるかどうかを調べるメソッドprime?(num)を定義してください。なお、素数とは「それ自身と1以外で割ることのできない数」です。
##コード
def prime?(num)
return false if num == 1
ary = (2..Integer.sqrt(num)).to_a
ary.each.none? {|i| num % i == 0}
end
num = gets.to_i
if prime?(num)
puts "#{num}は素数です"
else
puts "#{num}は素数ではありません"
end
##考え方
例えばnumと言う数があるとします。このnumと言う数が1とnum以外の約数を持たなければ素数といえます。ならば、2からnumの平方根までの数でnumを割ってやり、余りが0になる(割り切れる)ことがあればnumは素数ではないといえます。
numの平方根はRubyでは
Integer.sqrt(num)
と記述します。これを踏まえて
"2からnumの平方根までの数でnumを割ってやり、余りが0になる(割り切れる)ことがあればnumは素数ではない"を表現することを考えます。素数の場合はtrueをかえし、そうでない場合は全てfalseを返すこととすると、
コメントより
割り切るものが一つもなければ
true
,そうでなければfalse
と言う処理を行わせれば良さそうです。このような時、 none?
メソッドが活用できそうです。このメソッドは、対象とするオブジェクトのすべての要素が偽であれば真を返し、そうでなければ偽を返すものです。none?
を用いて以上のことを表現すると
ary = (2..Integer.sqrt(num)).to_a #2からnumの平方根までの配列を用意
ary.each.none? {|i| num % i == 0} #用意した配列の数全てがnumを割り切れなければtrue
となります。
他に素数でない数字としては"1"が挙げられます。"1"でもなく、上記の処理にも引っかからないnumが、素数だといえます。
また、素数でないことが分かった段階で処理は終えるべきです。なので、returnを用いてメソッドを終了させます。
def prime?(num)
return false if num == 1
ary = (2..Integer.sqrt(num)).to_a
ary.each.none? {|i| num % i == 0}
end
##参考にしたもの
Integer.sqrt (Ruby 3.0.0 リファレンスマニュアル)
[Enumerable#none? (Ruby 3.0.0 リファレンスマニュアル)]
(https://docs.ruby-lang.org/ja/3.0.0/method/Enumerable/i/none=3f.html)
いただいたコメントをもとに大幅に変更しました。(2021/4/2)