※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。
詳しくはコチラ
なるべくわかりやすい解説を付けました。
問題4 1 つの実数を出力 4 (paizaランク C 相当)
実数 N、自然数 M が入力されます。N を丸めて小数第 M 位まで出力してください。
また、N の小数部が小数第 M 位に満たない場合は 0 で埋めて出力してください。
なお、小数第 M 位が 5 になることはありません。
自然な丸め処理を行って出力すると正解になります。
- 入力される値
-
N M
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
- 期待する出力
- 答えの数値を出力してください。
N
末尾に改行を入れ、余計な文字 (とくに、813.00000 のような余分な 0)、空行を含んではいけません。
- 条件
-
すべてのテストケースにおいて、以下の条件をみたします。 * N は 0.001 以上 99.999999 未満 * M は 1 以上 5 未満 * N の小数第 M 位が 5 になることはありません。 * N に小数第 7 位以下の数値が含まれる入力は与えられません (0.1234567, 0.0000001 などは与えられません)。 * N の最も小さな位の値が 0 である入力は与えられません (0.8130, 10 などは与えられません)。
- 入力例1
-
0.813 1
- 出力例1
-
0.8
- 入力例2
-
0.813 2
- 出力例2
-
0.81
- 入力例3
-
0.813 3
- 出力例3
-
0.813
- 入力例4
-
0.813 4
- 出力例4
-
0.8130
解答 sprintf()を使うことで桁数を指定して表示させることができる
#入力値(浮動小数値)を受け取り変数に代入していく n,m = gets.split.map(&:to_f) ## 桁数を指定して表示させるmは浮動小数から数値に変換する puts sprintf("%.#{m.to_i}f", n)
または
#変数を初期化する n,m = 0,0 #nに浮動小数点として変数に代入し、mに数値として変数に代入する gets.split.map.with_index { |val, i| i == 0 ? n = val.to_f : m = val.to_i } # 桁数を指定して表示させる puts sprintf("%.#{m}f", n)
※ポイント (入力例4で解説)
puts sprintf("%.#{m}f", n)
↑は splintf(“%.4f”, 0.813)となり
0.813の小数点4桁まで表示してねという命令になるので
0.8130が出力された。
“#{m}”で式展開をすることで4にしている。(式展開しないと文字列mとして扱われる)
左側(第一引数)が何桁でどういう表示にするか
右側(第2引数)に表示させたい文字または数値を記述する
FINAL問題【実数をフォーマット指定して出力】複数の実数を出力 (paizaランク C 相当)
自然数 Q が与えられます。Q 回以下の問題に答えてください。
* 実数 N、自然数 M が入力されます。N を丸めて小数第 M 位まで出力してください。また、N の小数部が小数第 M 位に満たない場合は 0 で埋めて出力してください。
なお、小数第 M 位が 5 になることはありません。
自然な丸め処理を行って出力すると正解になります。
- 入力される値
-
Q N_1 M_1 N_2 M_2 ... N_Q M_Q
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
- 期待する出力
- 答えの数値を出力してください。
Ans1 Ans2 ... Ans_Q
末尾に改行を入れ、余計な文字 (とくに、813.00000 のような余分な 0)、空行を含んではいけません。
- 条件
-
すべてのテストケースにおいて、以下の条件をみたします。 * Q は 1 以上 101 未満 * N は 0.001 以上 99.999999 未満 * M は 1 以上 5 未満 * N の小数第 M 位が 5 になることはありません。 * N に小数第 7 位以下の数値が含まれる入力は与えられません (0.1234567, 0.0000001 などは与えられません)。 * N の最も小さな位の値が 0 である入力は与えられません (0.8130, 10 などは与えられません)。
- 入力例1
-
4 0.813 1 0.813 2 0.813 3 0.813 4
- 出力例1
-
0.8 0.81 0.813 0.8130
解答
#1行目の入力値(数値)を受け取る q = gets.to_i #q回繰り返す q.times do |i| # 半角スペース刻みの入力値を浮動小数として受け取る n,m = gets.split.map(&:to_f) # 桁数を指定して表示させる(このとき丸める(四捨五入する)) puts sprintf("%.#{m.to_i}f", n.round(m)) end
または
#1行目の入力値(数値)を受け取る q = gets.to_i #変数nとmを初期化する n,m = 0,0 #q回繰り返す q.times do |i| #nに浮動小数点として代入し、mに数値として代入する gets.split.map.with_index { |val, i| i == 0 ? n = val.to_f : m = val.to_i } # 桁数を指定して表示させる(このとき丸める(四捨五入する)) puts sprintf("%.#{m}f", n.round(m)) end
※ポイント 問題4で流用できるところは使おう
(入力例1で解説)
↓について
puts sprintf("%.#{m}f", n.round(m))