日別アーカイブ: 2022年8月19日

paizaLvアップ問題と解答(標準出力19)Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました。

問題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))

↑は splintf(“%.mf”, 0.813.round(m))となり

mが4のとき

0.813を小数点4桁で丸めて(四捨五入)から小数点4桁まで表示(このとき小数点4桁は0で埋める)してねという命令になるので

0.8130が出力された。

“#{m}”で式展開をすることで4にしている。(式展開しないと文字列mとして扱われる)

左側(第一引数)が何桁でどういう表示にするか
右側(第2引数)に表示させたい文字または数値を四捨五入して記述する

ちなみに

puts sprintf(“%.#{0}f”, 0.813round(0))

0.813の0.8を四捨五入して小数点0桁まで表示なので1となる

puts sprintf(“%.#{2}f”, 0.813round(2))

0.813の0.813を四捨五入して小数点2桁まで表示なので0.81となる