您的位置:首页 > 产品设计 > UI/UE

POJ 1019 Number Sequence(水~)

2015-12-28 14:22 465 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: