poj 1019

大致题意:

有一串数字串,其规律为

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

输入位置n,计算这一串数字第n位是什么数字,注意是数字,不是数!例如12345678910的第10位是1,而不是10,第11位是0,也不是10。总之多位的数在序列中要被拆分为几位数字,一个数字对应一位。
参考博客

代码:

#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int max_=31270;
int a[max_],s[max_];
void init()
{
    a[1]=s[1]=1;
    for(int i=2;i<max_;i++)
    {
        a[i]=a[i-1]+(int)log10((double)i)+1;
        s[i]=s[i-1]+a[i];
    }
}
int solve(int n)
{
    int k=1;
    while(s[k]<n)
        k++;
   int pos=n-s[k-1];
    int len=0;
     int i;
    for(i=1;len<pos;i++)
    {
        len+=(int)log10((double)i)+1;
    }
    return (i-1)/(int)(pow((double)10,len-pos))%10;
}
int main()
{
    init();
     int t;
     scanf("%d",&t);
     while(t--)
     {
         int n;
         scanf("%d",&n);
         printf("%d
",solve(n));
     }
     return 0;
}
原文地址:https://www.cnblogs.com/linhaitai/p/9794328.html