Number Sequence
Input: standard input
Output: standard output
Time Limit: 1 second
A single positive integer i is given. Write a program to find the digit located in the position i in the sequence of number groups S1S2…Sk. Each group Sk consists of a sequence of positive integer numbers ranging from 1 to k, written one after another. For example, the first80 digits of the sequence are as follows:
11212312341234512345612345671234567812345678912345678910123456789101112345678910
Input
The first line of the input file contains a single integer t (1 <=t <=25), the number of test cases, followed by one line for each test case. The line for a test case contains the single integer i (1 <=i <=2147483647)
Output
There should be one output line per test case containing the digit located in the position i.
Sample Input Output for Sample Input
2 8 3 |
2 2 |
题意:按照给定的序列,求出第i个数字是什么。
思路:sum[i]表示前i轮所达到的长度,sum[i]=sum[i-1]+len(i),然后每次,只要让i减去前面的轮数的长度即可,这里也可以用二分,更快一些。
AC代码如下:
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int T,t,num[210000],length;
ll sum[210000],n;
int len(int k)
{
int ret=0;
while(k>0)
{
ret++;
k/=10;
}
return ret;
}
int main()
{
int i,j,k,ret;
num[1]=1;
sum[1]=1;
i=1;length=1;
while(sum[i]<=2147483647LL)
{
i++;
k=len(i);
ret=i;
for(j=length+k;j>length;j--)
{
num[j]=ret%10;
ret/=10;
}
length+=k;
sum[i]=sum[i-1]+length;
}
scanf("%d",&T);
for(t=1;t<=T;t++)
{
scanf("%I64d",&n);
k=1;
while(n>sum[k])
k++;
n-=sum[k-1];
printf("%d\n",num[n]);
}
}