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这道题由于数据比较大,所以应该是先算出二的31次方是在连接后的第几个S中出现,然后根据结果定义数组变量大小,由于要查找的数一定存在而且数据有序,可以考虑用二分查找,然后就So easy 了。#include <stdio.h> __int64 n,num[70000]; __int32 w; void Bi_serch(int low, int high){ int mid; while(low<= high){ //mid=(low+high)/2; mid=low+((high-low)>>1); if(num[mid]<n && num[mid+1]>=n){ w=mid; return ; } else if(num[mid+1]<n) low=mid+1; else if(num[mid]>=n) high=mid-1; } } int main(){ int t; for(int i=1;i<=65540;++i) num[i]=num[i-1]+i; //printf("%lld\n",num[65540]); scanf("%d",&t); while(t--){ w=-1; scanf("%d",&n); Bi_serch(1,65540); int a=n-num[w]; a=a%9; if(a==0) a=9; printf("%d\n",a); } return 0; }