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 <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;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容