0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rubyで素数を判定するコードを書く

Last updated at Posted at 2021-03-31

##はじめに
この記事は「たのしい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)

「たのしいRuby 第6版」練習問題の解答例

いただいたコメントをもとに大幅に変更しました。(2021/4/2)

0
1
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?