POJ 1019 Number Sequence(枚举)

log10(n)+1可以得到数n的长度

Len[n]表示1到n这一段的总长度

s[n]表示第一段到第n段的总长度


先确定第n位在哪段中,然后从1开始枚举确定第n位在哪个数中。设k是这个数最后一位的位置,这个数为num,则第n位的数是num/pow(10,k-n)%10 (掐头去尾)


代码:

//
//  main.cpp
//  1019 Number Sequence
//
//  Created by Baoli1100 on 15/3/31.
//  Copyright (c) 2015年 Baoli1100. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
LL s[50005];
LL Len[50005];

#include <cmath>
int main(){
    Len[1]=1;
    for(int i=2;i<=50000;i++){
        Len[i]=Len[i-1]+log10(i*1.0)+1;
    }
    s[1]=1;
    for(int i=2;i<=50000;i++){
        s[i]=s[i-1]+Len[i];
    }
    LL n;
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%lld",&n);
        int i;
        for(i=1;s[i]<n;i++);
        i--;
        n-=s[i];
        int pos;
        int k=0;
        for(pos=1;n>k;pos++){
            k+=(log10(pos*1.0)+1);
        }
        pos--;
        int res;
        res=pos/(int)pow(10*1.0,(k-n)*1.0);
        res%=10;
        printf("%d\n",res);
        
    }
    return 0;
}


你可能感兴趣的:(POJ 1019 Number Sequence(枚举))