统计数字问题,我个菜鸡想不出递归法只能借鉴别人的思路。。
#include
#include
using namespace std;
//method1
//时间复杂度太大,一般的计算机无法满足10^9
void Solution1() {
int n;
cin >> n;
int nums[10] = { 0 };
for (int i = 1; i <= n; i++) {
int j = i;
while (j != 0) {
nums[j % 10]++;
j = j / 10;
}
}
for (int i = 0; i < 10; i++) {
cout << nums[i] << " ";
}
cout << endl;
}
//method2 这种方法妙啊
int nums[10];
void Solve(int n) {
//第一步计算数字n的位数
int len = log10(n) + 1;
//第二部计算区间数,也是最高位的值
int p = n / int(round(pow(10.0, len - 1)));
for (int i = 0; i < 10; i++) {
// (len - 1) * (int)round(pow(10.0,len - 2) 计算每个区间有多少个数
nums[i] += p * (len - 1) * (int)round(pow(10.0, len - 2));
}
for (int i = 0; i < p; i++) {
//计算每个区间最高位出现多少次。
nums[i] += (int)round(pow(10.0, len - 1));
}
//剩余的数
int t = n % (int)round(pow(10.0, len - 1));
// t == 200,300之类的情况
if (t == 0) {
nums[p]++;
nums[0] += len - 1;
return;
}
int lenT = log10(t) + 1;
if (lenT != len - 1) {
//处理10010这种中间有0的情况
nums[0] += (len - lenT - 1) * (t + 1);
}
nums[p] += t + 1;
Solve(t);
}
void Solution2() {
int n;
cin >> n;
int len = log10(n) + 1;
Solve(n);
for (int i = 0; i < len; i++) {
nums[0] -= (int)round(pow(10.0, i));
}
for (int i = 0; i < 10; i++) {
cout << nums[i] << " ";
}
cout << endl;
}