问题:输入自然数n,给出从1到n的所有数字中0、1、2、3、4、5、6、7、8、9这十个数字分别出现的次数。
思路一,逐个计算
#include<iostream>
using namespace std;
int main() {
int n;
cin >> n;
n = n;
if (n < 0) {
exit(-1);
}
int res[10] = { 0 };
for (int i = 1; i <= n; i++) {
int j = i;
while (j) {
res[j % 10]++;
j /= 10;
}
}
for (int i = 0; i < 10; i++) {
cout << res[i] << endl;
}
return 0;
}
思路二,逐位计算
这个思路是上面算法的优化。仅供参考,学习还是要靠自己的。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdio.h>
using namespace std;
int getHighestPosition(int n);
int pow(int e, int n);
int f(int n);
int main() {
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
//输入输出重定向
int n;
cin >> n;
if (n < 0) {
cout << "Input Error!!!" << endl;
exit(-1);
}
int res[10] = { 0 };
int fre;// = getHighestPosition(n);//得到最高位
while (n > 9) {
fre = getHighestPosition(n);//得到最高位
int tmp = f(fre);
int mid = n / pow(10, fre); //mid值为当前最高位数字
for (int i = 0; i < 10; i++) {
res[i] += mid * tmp;
}//从开始到最高位加9999...
for (int i = mid-1; i > 0; i--) {
res[i] += pow(10, fre);
}//最高位对应的数字数量
n = n % pow(10, fre);
res[mid] += n + 1;//*****
}
while (n >= 0) {
res[n]++;
n--;
}
//0要记得减一
res[0]--;
for (int i = 0; i < 10; i++) {
cout << res[i] << endl;
}
return 0;
}
int getHighestPosition(int n) {
int count = 0;
while (n > 0) {
count++;
n = n / 10;
}
return count - 1;
}
int pow(int e, int n) {
int result = 1;
while (n > 0) {
result = result * e;
n--;
}
return result;
}
int f(int n) {
int res = 0;
if (n <= 1) {
return 1;
}
return 10 * f(n - 1) + pow(10, n - 1);
}
发发代码,记录自己的学习过程,同时尽可能地为有需要的同志提供帮助。