POJ 1019 Number Sequence(枚举)

来源:互联网 发布:56网络视频下载器 编辑:程序博客网 时间:2024/06/05 06:08

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 longLL 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;}


0 0