find the nth digit
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14036 Accepted Submission(s): 4312
Problem Description
假设:
S1 = 1
S2 = 12
S3 = 123
S4 = 1234
.........
S9 = 123456789
S10 = 1234567891
S11 = 12345678912
............
S18 = 123456789123456789
..................
现在我们把所有的串连接起来
S = 1121231234.......123456789123456789112345678912.........
那么你能告诉我在S串中的第N个数字是多少吗?
S1 = 1
S2 = 12
S3 = 123
S4 = 1234
.........
S9 = 123456789
S10 = 1234567891
S11 = 12345678912
............
S18 = 123456789123456789
..................
现在我们把所有的串连接起来
S = 1121231234.......123456789123456789112345678912.........
那么你能告诉我在S串中的第N个数字是多少吗?
Input
输入首先是一个数字K,代表有K次询问。
接下来的K行每行有一个整数N(1 <= N < 2^31)。
接下来的K行每行有一个整数N(1 <= N < 2^31)。
Output
对于每个N,输出S中第N个对应的数字.
Sample Input
6 1 2 3 4 5 10
Sample Output
1 1 2 1 2 4
这道题先用a[]数组来记录每个数Si的长度,比如a[2]=a[1]+2,因为s2长度为2,那么总串长度就是之前加上当前。
然后用二分找出来n所在长度属于哪个s串,然后对9取余就可以了
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
long long a[100000];
long long l,r,mid;
long long erfen(long long n)
{
l=0;r=100000;
mid=(l+r)/2;
while(r-l>1)
{
if(n<a[mid])
{
r=mid;
}
else
{
l=mid;
}
mid=(l+r)/2;
}
}
int main()
{
a[0]=0;
for(int i=1;i<=100000;i++)
a[i]=a[i-1]+i;
long long t,n;
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
erfen(n);
int x;
if(n>a[l])
x=r;
else x=l;
n-=a[x-1];
int ans=n%9;
if(ans==0)
printf("9\n");
else printf("%d\n",ans);
}
}