Toy と帽子と ADP BE

主にプログラミングに関わる話をゆるくエモくやっていきます

A. Sum of Round Numbers (Codeforces Round #640 Div. 4)

記念すべきこどふぉDiv. 4の一問目!

問題

https://codeforces.com/contest/1352/problem/A

問題概要

整数nが与えられるので、それを丸めた数の和として表現せよ。その際、項の数は最小になるようにせよ。

考察

例えば1234なら1000200304に分けろということです。

やりかたはいろいろありそうですが、自分はコンテストでは入力を文字列として取って、各桁の数に対して適切な数だけ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で出ても違和感ないのでは?