今回はpaiza 標準入力メニューセクション8【実数をフォーマット指定して出力】をRubyとPythonで解説します。
セクション8は、float(浮動小数点型)を任意の桁で丸め・0埋めして出力する問題です。
※ この問題集を進めると小数点数の丸め処理が出てきますが、奇数丸めと偶数丸めとで差が出る入力データは与えられないため、丸め処理の方式については考慮する必要はありません。
本記事で使用しているメソッドについて
解答例で使っているメソッドについて、下記の記事で詳しく解説していますので参考にしてみて下さい。
- [Ruby] 標準入力によるデータ取得1
- [Ruby] 標準入力によるデータ取得2
- [Ruby] 標準入力によるデータ取得3
- [Ruby] 標準出力(データを任意に整形して出力する)
- [Ruby]配列の基本操作1
- [Ruby]繰り返し処理
セクション8:【実数をフォーマット指定して出力】
8-STEP1: 1 つの実数を出力 (paizaランク D 相当)
1行で入力された浮動小数点数nをそのまま出力する問題です。
- Nは 0.001 以上 99.999 未満
- Nに小数第 4 位以下の数値が含まれる入力は与えられません( 0.1234 、 0.00001 などは与えられません)。
入出力例
入力例1 0.813 出力例1 0.813 入力例2 99 出力例2 99
Ruby解答例1
入力文字列を浮動小数点数nに変換し、putsメソッドで出力しています。
# 解答例1 # 入力 n = gets.to_f # 出力 puts(n)
Ruby解答例2
浮動小数点数nをpメソッドで出力しても正解です。
# 解答例2 # 入力 n = gets.to_f # 出力 p(n)
Python解答例
入力文字列を浮動小数点数nに変換し、printメソッドで出力しています。
# 解答例 # 入力 n = float(input()) # 出力 print(n)
8-STEP2: 1 つの実数を出力 2 (paizaランク D 相当)
1行で入力された浮動小数点数nをそのまま出力する問題です。
- N は 0.001 以上 999,999,999,999.999 未満
- N に小数第 4 位以下の数値が含まれる入力は与えられません (0.1234 、 0.0001 などは与えられません)。
- N の最も小さな位の値が 0 である入力は与えられません (0.8130 、 10 などは与えられません)。
入出力例
# 入出力例 INPUT1 = <<~"EOS" 0.813 EOS OUTPUT1 = <<~"EOS" 0.813 EOS INPUT2 = <<~"EOS" 10000000000.5 EOS OUTPUT2 = <<~"EOS" 10000000000.5 EOS
Ruby解答例1
入力文字列を浮動小数点数nに変換し、putsメソッドで出力しています。(8-STEP1 Ruby解答例1と同じコードです。)
# 解答例1 # 入力 n = gets.to_f # 出力 puts(n)
Ruby解答例2
浮動小数点数nをpメソッドで出力しても正解です。(8-STEP1 Ruby解答例2と同じコードです。)
# 解答例2 # 入力 n = gets.to_f # 出力 p(n)
Python解答例
入力文字列を浮動小数点数nに変換し、printメソッドで出力しています。(8-STEP1 Python解答例と同じコードです。)
# 解答例 # 入力 n = float(input()) # 出力 print(n)
8-STEP3: 1 つの実数を出力 3 (paizaランク D 相当)
小数点数nが入力され、n を丸めて小数第 3 位まで出力する問題です。また、n の小数部が小数第 3 位に満たない場合は 0 で埋めて出力します。
入出力例
# 入出力例 INPUT1 = <<~"EOS" 0.813 EOS OUTPUT1 = <<~"EOS" 0.813 EOS INPUT2 = <<~"EOS" 8.13 EOS OUTPUT2 = <<~"EOS" 8.130 EOS INPUT3 = <<~"EOS" 3.141692 EOS OUTPUT3 = <<~"EOS" 3.142 EOS
Ruby解答例1
入力文字列を浮動小数点数nに変換し、round(d)
で3桁に丸めます。
式展開と%メソッド"%.#{d}f" % n
で n をd=3桁で0埋めしてputsメソッドで出力しています。
# 解答例1 d = 3 # 入力 n = gets.to_f # 小数第 d 位に丸める n = n.round(d) # 出力 puts("%.#{d}f" % n)
Ruby解答例2
入力文字列を浮動小数点数nに変換し、round(d)
で3桁に丸めます。
formatメソッドformat("%.*f", d, n)
で n をd=3桁で0埋めしてputsメソッドで出力しています。
# 解答例2 d = 3 # 入力 n = gets.to_f # 小数第 d 位に丸める n = n.round(d) # 出力 puts(format("%.*f", d, n))
Python解答例1
入力文字列を浮動小数点数nに変換し、round(d)
で3桁に丸めます。
f文字列f"{n:.{}f}"
で n をd=3桁で0埋めしてprintメソッドで出力しています。
# 解答例1 d = 3 # 入力 n = float(input()) # 小数第 d 位に丸める n = round(n, d) # 出力 print(f"{n:.{d}f}")
Python解答例2
入力文字列を浮動小数点数nに変換し、round(d)
で3桁に丸めます。
formatメソッド"{:.{}f}".format(n, d)
で n をd=3桁で0埋めしてprintメソッドで出力しています。
# 解答例2 d = 3 # 入力 n = float(input()) # 小数第 d 位に丸める n = round(n, d) # 出力 print("{:.{}f}".format(n, d))
8-STEP4: 1 つの実数を出力 4 (paizaランク C 相当)
小数点数nと整数mが半角スペース区切りで入力され、n を丸めて小数第 m 位まで出力する問題です。また、n の小数部が小数第 m 位に満たない場合は 0 で埋めて出力します。
入出力例
# 入出力例 INPUT1 = <<~"EOS" 0.813 1 EOS OUTPUT1 = <<~"EOS" 0.8 EOS INPUT2 = <<~"EOS" 0.813 2 EOS OUTPUT2 = <<~"EOS" 0.81 EOS INPUT3 = <<~"EOS" 0.813 3 EOS OUTPUT3 = <<~"EOS" 0.813 EOS INPUT4 = <<~"EOS" 0.813 4 EOS OUTPUT4 = <<~"EOS" 0.8130 EOS
Ruby解答例1
入力文字列を半角スペースで分割し、浮動小数点数n、整数mに変換して、浮動小数点数nをround(m)
でm桁に丸めます。
式展開と%メソッド"%.#{m}f" % n
で n をm桁で0埋めしてputsメソッドで出力しています。
# 解答例1 # 入力 n, m = gets.split n = n.to_f m = m.to_i # 小数第 m 位に丸める n = n.round(m) # 出力 puts("%.#{m}f" % n)
Ruby解答例2
入力文字列を半角スペースで分割し、浮動小数点数n、整数mに変換して、浮動小数点数nをround(m)
でm桁に丸めます。
formatメソッドformat("%.*f", m, n)
で n をm桁で0埋めしてputsメソッドで出力しています。
# 解答例2 # 入力 n, m = gets.split n = n.to_f m = m.to_i # 小数第 m 位に丸める n = n.round(m) # 出力 puts(format("%.*f", m, n))
Python解答例1
入力文字列を半角スペースで分割し、浮動小数点数n、整数mに変換して、浮動小数点数nをround(n, m)
でm桁に丸めます。
f文字列f"{n:.{m}f}"
で n をd=3桁で0埋めしてprintメソッドで出力しています。
# 解答例1 # 入力 n, m = input().split() n = float(n) m = int(m) # 小数第 m 位に丸める n = round(n, m) # 出力 print(f"{n:.{m}f}")
Python解答例2
入力文字列を半角スペースで分割し、浮動小数点数n、整数mに変換して、浮動小数点数nをround(n, m)
でm桁に丸めます。
formatメソッド"{:.{}f}".format(n, m)
で n をm桁で0埋めしてprintメソッドで出力しています。
# 解答例2 # 入力 n, m = input().split() n = float(n) m = int(m) # 小数第 m 位に丸める n = round(n, m) # 出力 print("{:.{}f}".format(n, m))
8-FINAL: 【実数をフォーマット指定して出力】複数の実数を出力 (paizaランク C 相当)
1行目で整数q、続くq行で小数点数nと整数mが半角スペース区切りで入力され、各n, m でnを丸めて小数第m位まで出力する問題です。また、nの小数部が小数第m位に満たない場合は 0 で埋めて出力します。
入出力例
# 入出力例 INPUT1 = <<~"EOS" 4 0.813 1 0.813 2 0.813 3 0.813 4 EOS OUTPUT1 = <<~"EOS" 0.8 0.81 0.813 0.8130 EOS
Ruby解答例1
整数qとq行分の小数点数n, 整数m を受け取り、配列aryに格納します。
aryの先頭から順に参照し、式展開と%メソッド"%.#{m}f" % n
でnをm桁で丸め、m桁で0埋めしてputsメソッドで出力しています。
# 解答例1 # 入力 q = gets.to_i ary = q.times.map do n, m = gets.split [n.to_f, m.to_i] end # 出力 ary.each { |n, m| puts("%.#{m}f" % n.round(m)) }
Ruby解答例2
整数qとq行分の小数点数n, 整数m を受け取り、配列aryに格納します。
aryの先頭から順に参照し、formatメソッドformat("%.*f", m, n.round(m))
でnをm桁で丸め、 m桁で0埋めしてputsメソッドで出力しています。
# 解答例2 # 入力 q = gets.to_i ary = q.times.map do n, m = gets.split [n.to_f, m.to_i] end # 出力 ary.each { |n, m| puts(format("%.*f", m, n.round(m))) }
Python解答例1
整数qとq行分の小数点数n, 整数m を受け取り、配列aryに格納します。
リスト内包表記でaryの先頭から順に参照し、f文字列f"{round(n, m):.{m}f}"
でnをm桁で丸め、 m桁で0埋めしてputsメソッドで出力しています。
# 解答例1 # 入力 q = int(input()) ary = [] for _ in range(q): n, m = input().split() ary.append([float(n), int(m)]) # 出力 [print(f"{round(n, m):.{m}f}") for n, m in ary]
Python解答例2
整数qとq行分の小数点数n, 整数m を受け取り、配列aryに格納します。
リスト内包表記でaryの先頭から順に参照し、formatメソッド"{:.{}f}".format(n, m)
で n をm桁で0埋めしてprintメソッドで出力しています。
# 解答例2 # 入力 q = int(input()) ary = [] for _ in range(q): n, m = input().split() ary.append([float(n), int(m)]) # 出力 [print("{:.{}f}".format(round(n, m), m)) for n, m in ary]
今回のまとめ
Ruby
小数点数nを小数点第m位で四捨五入する。
(nの値はそのままで表示だけ丸めたいときは省略する)
n = n.round(m)
小数第m位で偶数丸めを行い、0埋めして出力する
puts("%.#{m}f" % n)
puts(format("%.*f", m, n))
Python
小数点数nを小数点第m位で偶数丸めを行う
(nの値はそのままで表示だけ丸めたいときは省略する)
n = round(n, m)
小数第m位で四捨五入して、0埋めして出力する
print(f"{n:.{m}f}")
print("{:.{}f}".format(n, m))
セクション8では小数点数の丸め出力を扱いました。
今回の問題集では丸め処理の方法は特に気にしなくてよかったですが、偶数丸めと四捨五入では処理結果が異なる場合があります。
小数点数の丸め処理については奥が深く、今のところ当ブログでは解説していないので、興味があれば「偶数丸め・銀行丸め」でググって調べてみて下さい。
次のセクションは文字列の0埋めと半角スペース埋めの問題です!