POJ1019

 摘要:打表记录以断为单位的位数。

 

#include <iostream>
#include <climits>
#include <iomanip>
#include <cassert>
using namespace std;

unsigned int table[31270] = {0};

int calLen(int i)
{
    if( i>= 1000000000 ){
        return 10;   
    }
    if( i>= 100000000 ){
        return 9;   
    }
    if( i>= 10000000 ){
        return 8;   
    }
    if( i>= 1000000 ){
        return 7;   
    }
    if( i>= 100000 ){
        return 6;   
    }
    if( i>= 10000 ){
        return 5;   
    }
    if( i>= 1000 ){
        return 4;   
    }
    if( i>= 100 ){
        return 3;   
    }
    if( i>= 10 ){
        return 2;   
    }

    return 1;
}

int main()
{
    int seg = 1;
    unsigned int seg_len = 0;
    while( true ){
        int len = calLen(seg);
        seg_len += len;
        table[seg] = table[seg-1] + seg_len;
        if( table[seg] > INT_MAX ){
            break;
        }
        seg = seg+1;
    }
   
    int n;
    cin >> n;
    for(int i=1; i<=n; i++){
        int pos;
        cin >> pos;   
        int index = 1;
        while( table[index] < pos ){
            index++;
        }
        pos = pos - table[index-1];
        int num = 1;
        int len = 0;
        while( len + calLen(num) < pos ){
            len = len+calLen(num);
            num++;       
        }   
        pos = pos - len;
        assert(pos <= 10);
        char buf[11];
        sprintf(buf, "%d", num);
        cout << buf[pos-1] << endl;   
    }   

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值