paiza プログラミング

[Ruby|Python]paiza 標準出力メニュー 【実数をフォーマット指定して出力】

paiza_stdout_8

今回はpaiza 標準入力メニューセクション8【実数をフォーマット指定して出力】をRubyとPythonで解説します。

セクション8は、float(浮動小数点型)任意の桁で丸め・0埋めして出力する問題です。

※ この問題集を進めると小数点数の丸め処理が出てきますが、奇数丸めと偶数丸めとで差が出る入力データは与えられないため、丸め処理の方式については考慮する必要はありません。

本記事で使用しているメソッドについて

解答例で使っているメソッドについて、下記の記事で詳しく解説していますので参考にしてみて下さい。

セクション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

浮動小数点数npメソッドで出力しても正解です。

# 解答例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

浮動小数点数npメソッドで出力しても正解です。(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に変換して、浮動小数点数nround(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に変換して、浮動小数点数nround(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に変換して、浮動小数点数nround(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に変換して、浮動小数点数nround(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, mnを丸めて小数第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

整数qq行分の小数点数n, 整数m を受け取り、配列aryに格納します。
ary
の先頭から順に参照し、式展開と%メソッド"%.#{m}f" % nnを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))nm桁で丸め、 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}"nm桁で丸め、 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埋めと半角スペース埋めの問題です!



【PR】アルゴリズム学習でお世話になった本


アルゴリズム関連の技術書は大抵C/C++で書かれていますが、ある程度プログラムが出来れば、処理の流れは理解することが出来ます。






通称: 螺旋本。C++で解説されています。AOJ(Aizu Online Judge)を運営している会津大学の渡辺准教授が書いた本です。データ構造や計算量の内容から丁寧に書いてありますのでアルゴリズム学習の最初の参考書としてオススメです。







通称: 蟻本。C++で解説されています。競技プログラミング中級者の定番書と言われていて、競技プログラミングで利用できる色々なアルゴリズムを学ぶことが出来ます。かなり高度な内容も含まれているので1冊分を完全に理解するのにはかなりの時間がかかりそうですが、手元に置いて何度も読み返しています。







通称: チーター本。C#, C++, JAVAでTopcoderの問題を解説しています。初心者~中級者向けに書かれているので解説が非常に丁寧です。







Python3でアルゴリズムを解説している本です。講義スタイルの本で、図やフローチャートを使ってアルゴリズムとデータ構造についてしっかりと説明されています。代わりにコードは少なめです。Pythonコードが読めなくても十分理解できると思います。


-paiza, プログラミング
-, ,

© 2024 じゃいごテック