二分 找区间
题目:
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)。
Output
对于每个N,输出S中第N个对应的数字.
Sample Input
6
1
2
3
4
5
10
Sample Output
1
1
2
1
2
4
#include<stdio.h>
long long a[100006];
void init()
{
a[0]=0;
for(long long i=1;i<=100000;i++)
{
a[i]=a[i-1]+i;
}
}
int main()
{
long long n,m,k;int t; long long l,r; long long mid; long long x;
init();
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
l=1; r=100000; mid=(l+r)/2;
while(r-l>1)
{
if(a[mid]>n)
{
r=mid;
}
else{
l=mid;
}
mid=(l+r)/2;//别忘了求mid
}
if(a[l]<n)//找出a[l]还是a[r]在n的右边
{
x=r;
}
else
{
x=l;
}
printf("%d\n",(n-a[x-1])%9?(n-a[x-1])%9:9);
}
}