uva--10706+递推

题意:

   给定一个形如11212312341234512345612345671234567812345678912345678910123456789101112345678910的序列,输入一个i,输出处于第i个位置上的数。

思路:

   开始的时候以为是要输出第i个整数,然后就WA了好几发;后面又看了一遍题后发现不是整数,就是那个位置上的数;

基本的思路是:先预处理出所有序列1的位置,然后每输入一个i值就找离他最近的那个1,然后再遍历一遍那个1所在的序列就可以得到答案了。

求1的位置的时候,需要记录每个序列的长度和整数的个数(其实也就是那个序列最大的那个数),因为每一个序列都是在其前一个序列的基础上增加了一个数,所以可以用递推的思路。


代码如下:


<span style="font-size:18px;">#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

#define LL long long

typedef struct
{
    LL x,cnt,len;
}P;
P p[1000000];

int main()
{
    LL len=0,n,j;
    int i,k=1;
    p[0].x=0; p[0].cnt=0;
    while(len<2200000000)
    {
        p[k].x=len+1;
        p[k].cnt=p[k-1].cnt+1;
        int t=p[k].cnt,d=0;
        while(t)
        {
            d++;
            t=t/10;
        }
        p[k].len=p[k-1].len+d;
        len+=p[k].len;
        k++;
    }
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld",&n);
        for(i=0;i<k-1;i++)
            if(p[i].x<=n&&p[i+1].x>n)
                break;
        int m=n-p[i].x+1;
        int cnt=0,d=1,ans;
        while(1)
        {
            if(d>=0&&d<=9)
                cnt++;
            else if(d>=10&&d<100)
                cnt+=2;
            else if(d>=100&&d<1000)
                cnt+=3;
            else if(d>=1000&&d<10000)
                cnt+=4;
            else if(d>=10000&&d<100000)
                cnt+=5;
            if(cnt>=m)
            {
                for(i=0;i<cnt-m;i++)
                    d=d/10;
                ans=d%10;
                break;
            }
            d++;
        }
        printf("%d\n",ans);
    }
 return 0;
}
</span>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值