Rubyについて勉強してみる
検証を行ったサイト
https://paiza.io/ja/projects/new
素数判定(2..平方根までの値で判定)
ARGV[0]
は入力フォーマットで入力された自然数nが入る想定
include Math
# n = 324899
n = ARGV[0].to_i
ne = sqrt(n).to_i
pflag = true
for num in 2..ne do
if n % num == 0 && pflag == true
pflag = false
puts "#{n}は合成数です。 "
end
end
if pflag == true
puts "#{n}は素数です。 "
end
補足説明
for num in 2..ne do
は2からneの数まで1個1個取り出して処理を行う。例えばnが100の場合は平方根neは10になり、上記式に当てはめると、for num in 2..ne(実質10) do
となり、1回目の処理はnum = 2, 2回目の処理はnum = 3, 3回目の処理は num = 4となる。これをnum=10になるまで繰り返す。
if n % num == 0
は割り算を行った時の余りが0かどうかを確認している。
上記例でn=100,num =2の場合、結果は50余り0になるので、2のような何かしらの数値でキレイに割り切れる=素数ではない、となり、「100は合成数です。」とprint(出力)される。
上記例でn=9の場合、num=2ではif文の判定式では結果は4余り1になるので、次のnum=3が実行され、if文の判定式では結果は3余り0になるので割り切れてしまうので、「9は合成数です。」とprint(出力)される。
2つの自然数の最大公約数を求める
n = ARGV[0].to_i
m = ARGV[1].to_i
gcd = n.gcd(m)
print("gcd == #{gcd}")
補足説明
n.gcd(m)
という処理はもうnとmの最大公約数を求める事が出来るメソッドなので活用した。
変数gcdには数値nとmの最大公約数が入っている。
メジアンを求める(奇数の場合)
# Your code here!
ar = [2.0, 16.8, 31.0, 32.2, 39.2, 56.9, 60.6, 68.9, 74.5, 77.8, 77.8]
median = ar[(ar.size/2).floor]
print("メジアン = #{median} ")
前提知識
配列のindexという概念と実際の配列の件数の概念が少しむずかしいので解説する。
例えばar =[a, b, c, d]
と言った配列がある場合、aは1番目ではなく0番目である。
なので0番目、1番目、2番目、3番目とカウントする。
aを取得したい場合はar[0]
と書けばaが取得できる。
しかしながら、.size
などで配列の件数を取得した場合は上記は4と返される。(4つという意味)
で、安直にar[4]
と書くとエラーになる。理由は配列の数え方は0から始まり、4番目([4])
というのは5件データ入っている時の5件目を指すから。
だからar[ar.size -1](ar[3])
としてあげないとarの中のdは取得できない。
この-1してあげるのが大事。sizeで取得した数値をそのまま使わず-1してあげる。
補足説明
ar.size
は配列arの件数を取得する。上記例だと11が取得できる。
出題だと、奇数の配列の中央値(真ん中の数値)を取得したいので、11であれば6 101であれば51。
ar.size(11) /2 (計算結果5.5)で、その値を小数を切り捨てて(floor)奇数の場合の中央値になる
(floorを使って切り捨てた結果5になる)
ar[(ar.size/2).floor]
について
ar[3]と書くと、ar配列の4番目を取り出すということ。
(ar.size/2).floor
= 計算結果5なので、配列arの6番目(配列の何番目の数え方は0,1,2,3,4,5だから)を取得すること。
メジアンを求める(偶数の場合、中央値の2つの数値の平均を求める)
ar = [4.5, 10.2, 17.5, 37.9, 38.9, 45.4, 62.2, 88.2, 96.1, 96.1]
median = (ar[ar.size/2 -1] + ar[ar.size/2] )/ 2
print("メジアン = #{median} ")
補足説明
ar配列が10件なので、
ar.size/2 -1
= 4
ar.size/2
= 5
ar[4]は配列の5番目を取り出す、ar[5]は配列の6番目を取り出す、になるので、
足して割っている。
メジアンを求める(奇数、偶数対応)
ar = [24.0, 31.7, 37.2, 44.3, 50.6, 63.5, 82.5, 91.4, 93.1, 93.1]
if ar.size % 2 == 0
median = (ar[ar.size/2 -1] + ar[ar.size/2] )/ 2
print("メジアン偶数 = #{median} ")
else
median = ar[(ar.size/2).floor]
print("メジアン奇数 = #{median} ")
end
補足説明
最初のif文で配列の件数が奇数か偶数か判定している。
今までの応用。
偶数の処理は上の偶数の処理、奇数の場合は奇数の処理を行う。
Discussion