题意:
假设:S1 = 1
S2 = 12
S3 = 123
S4 = 1234
.........
S9 = 123456789
S10 = 1234567891
S11 = 12345678912
............
S18 = 123456789123456789
..................
现在我们把所有的串连接起来
S = 1121231234.......123456789123456789112345678912.........
求第N个数是什么数字
首先我不先连起来,看红色的部分,我们先确定n在第几行第几个数,因为所有行的个数程等差数列,所以可以这样确定初始行:
t=sqrt(2.0*n),然后在t行的基础上找到大于等于n的那一行 i,然后再找前一行,用n-sum(i-1)就是它在第i行的第几位
所以思路为:
//对于任意的数 N,
//先确定其区间 si - si+1
//确定其区间后
//再确定 在si中第几个 1234456789 ,
//然后再确定第几位数
代码:
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#define lson l,mid,num<<1
#define rson mid+1,r,num<<1|1
using namespace std;
const int M=100005;
int a[9]={1,2,3,4,5,6,7,8,9};
int sum(int n)
{
if(n%2)return n*((n+1)/2);
else
return (n/2)*(n+1);
}
int main()
{
int k,n;
while(scanf("%d",&k)!=EOF)
{
while(k--)
{
scanf("%d",&n);
int t=sqrt(2.0*n);
int i;
for(i=t;; i++)
{
if(sum(i)>=n)break;
}
int tt=n-sum(i-1);
tt--;
printf("%d\n",a[tt%9]);
}
}
return 0;
}