POJ 1019 Number Sequence(水~)

470 篇文章 3 订阅

Description
一个数字序列,规律是这样的:
1 12 123 1234 12345 123456 1234567 12345678 123456789 12345678910 1234567891011 123456789101112……
求这个序列中的第n位是什么数字
Input
第一行为一个整数T表示用例组数,每组用例占一行为一个整数n
Output
对于每组用例,输出这个数字序列中第n位的数字
Sample Input
2
8
3
Sample Output
2
2
Solution
简单题,首先统计每个数字占的位数cnt[i]=(int)log10(i)+1,然后统计每个1~i组成的串占的位数sum[i]=cnt[1]+…+cnt[i],预处理出这些之后,对于每个n,首先通过不断减sum[i]得知第n位处于哪一个1~m之间,然后再不断减cnt[i]得知第n位位于1~m中哪一个数中,然后问题就变成找到一个数字temp的第n位,这个可以先将从左往右数的第n位转化为从右往左数的第(int)log10(temp*1.0)+1-n位,那么ans=temp/(int)pow(10.0,1.0*n)%10
Code

#include<stdio.h>
#include<string.h>
#include<math.h>
#define maxn 33333
typedef long long ll;
ll cnt[maxn],num[maxn],n;
int t,ans;
void init()
{
    memset(cnt,0,sizeof(cnt));
    memset(num,0,sizeof(num));
    for(int i=1;i<maxn;i++)
    {
        cnt[i]=cnt[i-1]+(int)log10(1.0*i)+1;
        num[i]=num[i-1]+cnt[i];
    }
}
int main()
{
    init();
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld",&n);
        int temp=1;
        while(n>num[temp])temp++;
        n-=num[temp-1];
        temp=1;
        while(n>(int)log10(temp*1.0)+1)n-=((int)log10(temp*1.0)+1),temp++;
        n=(int)log10(temp*1.0)+1-n;
        ans=temp/(int)pow(10.0,1.0*n)%10;
        printf("%d\n",ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值