AtCoder が提供しているABC(AtCoder Beginner Contest)273 のB問題をC++とPythonで解いてみました。ABC273は、2022年10月15日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 Broken Rounding(Difficulty : 178)
問題はリンク先をご覧ください。
四捨五入の処理をする問題です。AtCoder Problems による Difficulty は、178 でした。
解答案
問題を解く方針を書きだします。
- X と K を読み込む。
- i = 0, 1, … , K – 1 に対して、X に対して以下の操作をする。
- 10i の位を四捨五入する。
- 10i + 1 の位をそのままにするか1増やす。
- 最終的な X を出力する。
C++ プログラム例(ABC273B)
方針に従いプログラムします。X の大きさから関係する変数は、unsigned long long int 型にしました。
変数 t1 は、四捨五入する桁の数字、変数 t2 は、四捨五入の影響を受ける一つ上の桁以上の数字を表します。t2 は、10i + 1 で割った後に、四捨五入の操作を行い、10i + 1 を掛けて戻しています。
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long int ull;
int main()
{
ull x, k;
cin >> x >> k;
ull p = 10;
for (ull i = 0; i < k; ++i) {
ull t1 = (x % p)/(p / 10);
ull t2 = x / p;
if (t1 >= 5) {
x = (t2 + 1) * p;
} else {
x = t2 * p;
}
p *= 10;
}
cout << x << endl;
return 0;
}
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC273B)
Python では、C++ 版の実装を参考にプログラミングします。あまり Python らしい書き方ではないかもしれません。
"""AtCoder Beginner Contest 273 B"""
x, k = map(int, input().split())
for i in range(k):
p = 10 ** (i + 1)
t1 = (x % p)//(p // 10)
t2 = x // p
if t1 >= 5:
x = (t2 + 1) * p
else:
x = t2 * p
print(x)
Python 版も「AC」と判定されました。
最後に
四捨五入の仕組みを式に落とし込むところがポイントの問題でした。
引き続き ABC の問題を紹介していきます。