※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。
詳しくはコチラ
なるべくわかりやすい解説を付けました。
問題1
実数 N、自然数 M が入力されます。N を丸めて小数第 M 位まで出力してください。
また、N の小数部が小数第 M 位に満たない場合は 0 で埋めて出力してください。
なお、小数第 M 位が 5 になることはありません。
自然な丸め処理を行って出力すると正解になります。
入力例 0.813 4 出力例4 0.8130
解答
n,m = gets.split(' ').map(&:to_f) # 小数点以下の桁数を指定しています printf("%.#{m.to_i}f", n)
問題2 複数の実数を出力 (paizaランク C 相当)
自然数 Q が与えられます。Q 回以下の問題に答えてください。
実数 N、自然数 M が入力されます。N を丸めて小数第 M 位まで出力してください。また、N の小数部が小数第 M 位に満たない場合は 0 で埋めて出力してください。
なお、小数第 M 位が 5 になることはありません。
自然な丸め処理を行って出力すると正解になります。
入力例1
4 0.813 1 0.813 2 0.813 3 0.813 4
出力例1
-
0.8 0.81 0.813 0.8130
問題3 直角三角形の出力
自然数 N が与えられます。1 ≦ i ≦ N の各 i について、i 行目には以下の数列を出力してください。* 1 以上 i 以下の数値をすべて、半角スペース区切りで出力してください
- 入力例1
-
4
出力例1
-
1 1 2 1 2 3 1 2 3 4
解答
-
入力Nを代入
-
配列[1, 2, 3, 4]を作る
-
timesで繰り返し処理をする
-
a.takeを使うことで配列をiずつ取り出して半角スペースを間に入れて出力する
n = gets.to_i a = *(1..n) 1..n.times do |i| puts a.take(a[i]).join(' ') end
問題4 すべての行の長さが不定な 2 次元配列の出力
自然数NとN個の要素の数列Mが与えられます。
1 ≦ i ≦ N の各 i について、i 行目には以下の数列を出力してください。
1 以上 M_i 以下のすべての自然数を昇順、半角スペース区切りで出力してください。
入力例1
4 2 4 3 1
出力例1
1 2 1 2 3 4 1 2 3 1
入力例2
1 1
出力例2
1
解答 入力例1で解説
-
入力Nを受け取る
-
数列Mを受け取る
-
N回繰り返す
-
mの配列の数字−1回繰り返し(m[0]のときは2−1で1回)、1から初めて
-
繰り返しが終わったら、mの配列を加える1 2
-
2回目は(m[1]なので4−1で3回繰り返し)1 2 3までやったら
-
puts m[i]で1 2 3 4が出力されて
-
以下繰り返していく
n = gets.to_i m = gets.split(' ').map(&:to_i) n.times do |i| # ここで先に1,2,3,とやってから (m[i]-1).times { |j| print "#{j +1 } "} # 最後にmの配列を足す puts m[i] end