问题描述:从1页到n页,统计0到9出现的次数
暴力破解法
#include <iostream>
int main()
{
void baoli(int num);
baoli(11);
}
void baoli(int num)
{
using namespace std;
std::cout << "Hello World!\n";
cout << "请输入一个数字:";
cin >> num;
int m, t;//余数,当前页数
int k[10] = { 0,0,0,0,0,0,0,0,0,0 };
for (int i = 1; i <= num; i++)
{
t = i;
do {
m = t % 10;
k[m]++;
t = t / 10;
} while (t != 0);
}
for (int i = 0; i < 10; i++) {
cout << k[i] << endl;;
}
}
递归求解
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int c[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++) {//划分区间并加和
c[i] += p * (len - 1) * (int)round(pow(10.0, len - 2));
}
for (int i = 0; i < p; i++) {//最高位的值加和
c[i] += (int)round(pow(10.0, len - 1));
}
int t = (int)round(pow(10.0, len - 1));
t = n % t;//判断余数
if (t == 0) {//如果t为0
c[p]++;//最高位加1
c[0] += len - 1;//0位加len-1
return;//函数出口
}
int lenT = log10(t) + 1;//余数的最高位数
if (lenT != len - 1) {//若像10010这种情况,中间2个0也要相应的处理
c[0] += (len - lenT - 1) * (t + 1);//10000-10010共有11个中间有0的情况
}
c[p] += 1 + t;//最高位加和余数的部分
return solve(t);//递归循环
}
int main() {
int n;
while (cin >> n) {
fill(c, c + 10, 0);//fill(arr, arr + n, 要填入的内容);将数组中的元素赋值
int len = log10(n) + 1;
solve(n);
for (int i = 0; i < len; i++) {
c[0] -= (int)round(pow(10.0, i));//减去多加的0的个数
}
for (int i = 0; i < 10; i++) {//输出
cout << i << " : " << c[i] << endl;
}
}
}