Poj 1019

#include <iostream>
#include <math.h>

using namespace std;

// 設(shè) t(n) 表示為 123~n 的位數(shù)
// 則有 f(n) = f(n-1) + t(n)

int length = 80000;
int tn[80000];

// 計(jì)算一個(gè)數(shù)字的長(zhǎng)度,比如 12345678,則返回8
int getLength(int num) {
    int length = 0;
    while (num/10 != 0) {
        num/=10;
        length++;
    }
    return length + 1;
}

// 統(tǒng)一計(jì)算 tn[] 的值
void calculationTn() {
    tn[0] = 0;
    tn[1] = 1;
    for (int i =1; i < length; i++) {
        tn[i] = tn[i - 1] + getLength(i);
    }
}

// 計(jì)算該數(shù)字的第 index 位的數(shù)字,比如 12345678 第三位數(shù),則返回 3(number、index 必須大于 0)
int getNumFromIntegerByIndex(int number, int index) {
    int length = getLength(number);
    for (int i = 0; i < length - index; i++) {
        number/=10;
    }
    return number%10;
}

// 從123456789101112..中查找第 index 個(gè)數(shù)
int findFromNumber(int index) {
    for (int t = 1; t < length; t++) {
        if (index <= tn[t]) {
            return getNumFromIntegerByIndex(t, index - tn[t - 1]);
        }
    }
    return 0;
}

// 從完整數(shù)列(1 12 123 1234 12345 ....)中查找第 index 未數(shù)
int findFromWhole(int index) {
    for(int i = 1; i < length; i++) {
        if (index > tn[i]) {
            index -= tn[i];
        } else if (index < tn[i]) {
            return findFromNumber(index);
        } else {
            //number == tn[i]
            return getNumFromIntegerByIndex(i, getLength(i));
        }
    }
    return 0;
}

int main(int argc, const char * argv[]) {
    calculationTn();
    int n, num;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &num);
        printf("%d\n", findFromWhole(num));
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)巧妙的枚舉題Counterfeit DollarTime Limit: 1000MS Memory ...
    翹尾巴閱讀 276評(píng)論 0 0
  • 題目大意 給我們一個(gè)n×m的矩形格子,上面的值只有1和0,然后我們需要找到一個(gè)操作方式(即對(duì)哪些格子操作,對(duì)哪些格...
    四川孫一峰閱讀 1,167評(píng)論 0 0
  • 題意:第一個(gè)點(diǎn)是青蛙的坐標(biāo),第二個(gè)是青蛙妹子的坐標(biāo),其他的點(diǎn)是石頭的坐標(biāo),現(xiàn)在要問青蛙到青蛙妹子的地方,至少需要跳...
    Anxdada閱讀 1,008評(píng)論 0 1
  • POJ 1731 題意 求全排列 思路 直接調(diào)用next_premutation函數(shù)。
    vanadia閱讀 230評(píng)論 0 0
  • 前言 本篇講的是dubbo中比較重要的遠(yuǎn)程暴露,鑒于上一篇dubbo源碼解析-本地暴露采用一圖勝千言的寫法好像讀者...
    肥朝閱讀 13,581評(píng)論 16 40

友情鏈接更多精彩內(nèi)容