UVA1225
思路
思路很簡單, 因為題目說最大輸入N,最多不會超過10000, 輸入的數(shù)據(jù)組最多20行.我的思路很簡單, 就是采取枚舉1到N的數(shù), 然后算出每個數(shù)字分解成各位后統(tǒng)計到對應(yīng)的0~9中.但是對于查詢方, 不可每次查詢都去算一次, 這樣太浪費時間.所以我們先定數(shù)據(jù)結(jié)構(gòu)result(r)(c), 表示輸入的數(shù)字為r,有幾個c數(shù)字, 我們就可以得出第r個數(shù)要表示的就是第r-1個數(shù)要表示的加上r這個數(shù)自身, 即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;
}
總結(jié):
- 分解數(shù)Num
將一個數(shù)Num, 分解出各個位上的數(shù)字的思維就是, 每次取其最后一個位, 取完將其除10, 去掉最后一位,直到?jīng)]得取(Num == 0).
while(num) {
int s = num % 10;
num /= 10;
}