CH3-UVA1225

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 
#include 
#include 
#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;
}

你可能感兴趣的:(CH3-UVA1225)