统计数字问题
问题描述
一本书的页码从自然数1开始顺序编码直到自然数n。
书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。
例如,第6页用数字6表示而不是06或006等。
数字计数问题要求对给定书的总页码n,计算书的全部页码分别用到多少次数字0,1,2,···,9。
算法设计
给定表示书的总页码的十进制数n(1≤n≤10^9),计算书的全部页码中分别用到多少次数字0,1,2,···,9。
数据输入
输入数据由文件名为input.txt的文本文件提供。
每个文件只有1行,给出表示书的总页码的整数n。
结果输出
将计算结果输出到文件output.txt。
输出文件共10行,在第k(k = 1,2,···,10)行输出页码中用到数字k - 1的次数。
input
11
output
1
4
1
1
1
1
1
1
1
1
解题思路
遍历页码,对每个页码逐位处理。
代码实现(C)
#include <stdio.h>
int main() {
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int n, count[10] = {0}, num;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
num = i;
if (num < 10)
count[num % 10]++;
else
while (num) {
count[num % 10]++;
num /= 10;
}
}
for (int j = 0; j < 10; ++j)
printf("%d\n", count[j]);
}
代码实现(C++)
#include <iostream>
using namespace std;
int main() {
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int n, count[10] = {0};
cin >> n;
string temp;
for (int i = 1; i <= n; ++i) {
temp = to_string(i);
for (int j = 0; j < temp.size(); ++j)
count[(int) temp[j] - 48]++;
}
for (int k = 0; k < 10; ++k)
cout << count[k] << endl;
return 0;
}
经验总结
获取整数的每位数字:
#include <iostream>
using namespace std;
int main() {
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int num;
// 方法一:
cin >> num;
while (num) {
int bit = num % 10;
cout << bit << " ";
num /= 10;
}
cout << endl;
// 方法二:
cin >> num;
string stringNum = to_string(num);
for (int i = 0; i < stringNum.size(); ++i)
cout << stringNum[i] << " ";
return 0;
}
input
3847
1285
output
7 4 8 3
1 2 8 5