POJ 1019 Number Sequence

来源:互联网 发布:淘宝号被冻结解冻方法 编辑:程序博客网 时间:2024/05/18 12:40

这道题想到思路就简单  想不到就悲剧了    第一次想到的算法  果断超时   后面想到分成多组来算  每组不超过1亿位   还是超时   最后看了下别人的思想   如下:

题意:  求数列的第N位是什么              不是数   是位      例如   12345678910  第十位是1   不是10

这个序列是这样的

1

12

123

1234

12345

可以算出总共有多少排   每排的位数可以算数来   

给个N   就可以算出第N位数是在第几排     然后从1开始计算  速度很快   具体的看看代码

#include<cstdio>#include<cstring>long long s[40000];long long T;void Init(){    s[1] = 1;    long long  k,j,sum = s[1];    T = 2;    for(j = 2; sum <= 2147483647 ; j++)    {        if(j >= 10000) k = 5;            else  if(j >=1000)  k = 4;                else if(j >= 100) k = 3;                    else if(j >= 10) k = 2;                        else k = 1;        s[T] = s[T-1] + k;        sum += s[T];        T++;    }}int main(){    #ifdef LOCAL    freopen("in.txt","r",stdin);    freopen("out.txt","w",stdout);    #endif // LOCAL    Init();///T = 32169    long long K;    scanf("%lld",&K);    while(K--)    {        long long N,n = 0,i,j,result;        scanf("%lld",&N);        long long sum = 0;        for(i = 1; sum < N ;i++)            sum += s[i];        i--;//计算出了在第几排        if(i > 1){sum -= s[i]; N -= sum;}//第i排第N位        for(j = 1; j <= i && n < N ; j++)            {                if(j >= 10000) n += 5;                else  if(j >=1000) n += 4;                    else if(j >= 100) n += 3;                        else if(j >= 10) n += 2;                            else n += 1;            }        long long k = 1;        for(long long p = 0; p < n - N ; p++)            k *= 10;        result = --j / k % 10;        printf("%lld\n",result);    }    return 0;}


0 0
原创粉丝点击