POJ 1019 Number Sequence

这道题想到思路就简单  想不到就悲剧了    第一次想到的算法  果断超时   后面想到分成多组来算  每组不超过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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值