数字统计问题
2014-04-24 20:27
260 查看
#include <iostream> #include <memory> using namespace std; namespace { inline int pow10(int exp) { int result = 1; for (int idx = 0; idx != exp; ++idx) result *= 10; return result; } inline int figures(int number) { int exp = 0; for (int tmp = number / 10; tmp; tmp /= 10) ++exp; return exp; } void showDigitsCount(int *digits) { for (size_t idx = 0; idx != 10; ++idx) cout << digits[idx] << " "; cout << endl; } unique_ptr<int[]> digitCount(int number) { int unit = pow10(figures(number)); unique_ptr<int[]> digits(new int[10]()); digits[0] -= unit; for (int hyper = 0, highest = 0, remainder = number; unit; unit /= 10) { if (hyper) { for (int idx = 1; idx != 10; ++idx) digits[idx] += hyper * unit; digits[0] += (--hyper) * unit; } hyper = number / unit; highest = remainder / unit; remainder %= unit; if (unit) for (int idx = 0; idx != highest; ++idx) digits[idx] += unit; digits[highest] += remainder + 1; } return digits; } } int main(int argc, char **argv) { int number; cin >> number; auto counter = digitCount(number); showDigitsCount(counter.get()); return 0; }