UVA1225
思路
思路很简单, 因为题目说最大输入N,最多不会超过10000, 输入的数据组最多20行.我的思路很简单, 就是采取枚举1到N的数, 然后算出每个数字分解成各位后统计到对应的0~9中.但是对于查询方, 不可每次查询都去算一次, 这样太浪费时间.所以我们先定数据结构result(r)(c), 表示输入的数字为r,有几个c数字, 我们就可以得出第r个数要表示的就是第r-1个数要表示的加上r这个数自身, 即result(r)(c) = result(r)(c) + result(r - 1)(c).
//
// Created by sixleaves on 2016/11/19.
//
#include <cctype>
#include <cstring>
#include <cstdio>
#define MAXSIZE 10001
int result[MAXSIZE][10];
int main() {
memset(result, 0, sizeof(result));
for (int i = 1; i < MAXSIZE; i++) {
int temp = i;
int r = 0;
while (temp) {
r = temp % 10;
result[i][r]++;
temp = temp / 10;
}
for (int j= 0; j < 10; j++) {
result[i][j] += result[i - 1][j];
}
}
int n;
int input;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &input);
for (int j = 0; j < 10; j++) {
printf( j == 0? "%d" : " %d", result[input][j]);
}
printf("\n");
}
return 0;
}
总结:
- 分解数Num
将一个数Num, 分解出各个位上的数字的思维就是, 每次取其最后一个位, 取完将其除10, 去掉最后一位,直到没得取(Num == 0).
while(num) {
int s = num % 10;
num /= 10;
}