記念すべきこどふぉDiv. 4の一問目!
問題
https://codeforces.com/contest/1352/problem/A
問題概要
整数nが与えられるので、それを丸めた数の和として表現せよ。その際、項の数は最小になるようにせよ。
考察
例えば1234
なら1000
と200
と30
と4
に分けろということです。
やりかたはいろいろありそうですが、自分はコンテストでは入力を文字列として取って、各桁の数に対して適切な数だけ0
を付加して作っていきました。0の桁は対象外とする必要があります。
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { string s; cin >> s; int n = s.size(); vector<string> ans; for (int i = 0; i < n; i++) { if (s[i] != '0') { ans.emplace_back(s[i] + string(n - 1 - i, '0')); } } int sz = ans.size(); cout << sz << endl; for (int i = 0; i < sz; i++) cout << ans[i] << (i == sz - 1 ? '\n' : ' '); } }
別解
素直に数値として考えるなら、剰余を取って引いて、を桁を上がりつつ繰り返すというやり方が一例となります。
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { int n; cin >> n; vector<int> ans; int d = 1; while (d <= n) { d *= 10; if (n % d != 0) ans.emplace_back(n % d); n -= n % d; } int sz = ans.size(); cout << sz << endl; for (int i = 0; i < sz; i++) cout << ans[i] << (i == sz - 1 ? '\n' : ' '); } }
感想
正直AtCoderのABCのBくらい簡単な問題が来ると予想していたので、ちょっと驚きました。この問題ならDiv. 3やDiv. 2で出ても違和感ないのでは?