二分 找区间

题目:
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);
	 }
}
全部评论

相关推荐

11-03 14:38
重庆大学 Java
AAA求offer教程:我手都抬起来了又揣裤兜了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务