题意:

有一串数字串,其规律为

1 12 123 1234 12345 123456 1234567 12345678 123456789 12345678910 1234567891011 123456789101112······k

输入位置n,计算这一串数字第n位是什么数字,注意是数字,不是数!

例如12345678910的第10位是1,而不是10,第11位是0,也不是10。总之多位的数在序列中要被拆分为几位数字,一个数字对应一位。

Number Sequence(poj 1019)_i++Number Sequence(poj 1019)_ios_02
//运用了一个公式:求一个数的位数时,可以用 (int)log10((double)i)+1
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#define LL long long
#define M 100010
int num[M],b[M];//num[i]表示第i个数串的长度 
using namespace std;
void init()
{
    for(int i=1;i<=100000;i++)
      num[i]=num[i-1]+(int)log10((double)i)+1;
}
int main()
{
    init();//打表 
    int T;
    cin>>T;
    while(T--)
    {
        int n;LL length=0;
        cin>>n;
        for(int i=1;i<=100000;i++)
          if(length+(LL)num[i]<n)
            length+=(LL)num[i];
          else break;//找到所在数串 
        int p=0;
        for(int i=1;i<=100000;i++)
        {
            int tmp=(int)log10((double)i)+1;
            if(length+(LL)tmp<n)
              length+=(LL)tmp;
            else
            {
                p=i;
                break;//找到所在整数 
            }
        }
        memset(b,0,sizeof(b));
        int s=n-length,cnt=(int)log10((double)p)+1;
        while(cnt)//将所在整数分解 
        {
            b[cnt--]=p%10;
            p/=10;
        }
        cout<<b[s]<<endl;
    }
    return 0;
}
View Code