第一点还是注意理解题意吧,像S10这个序列,第10个integer是‘1’而非‘10’
起初因为搞错了意思用二次配方的方法在写,明白过来后开始无从下手,于是参考了讨论区的代码……
收获:
1. sprintf函数。sprintf函数打印到字符串中,而printf函数打印输出到屏幕上。sprintf函数在我们完成其他数据类型转换成字符串类型的操作中应用广泛。
2. <algorithm>库中的lower_bound函数。lower_bound与upper_bound都是二分函数,头文件<algorithm>
upper_bound返回第一个大于的元素的下标;
lower_bound返回第一个大于等于元素的下标。
代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
#define MAX 40000
int main(){
char s[10];
unsigned int group[MAX],sum[MAX];
int i,j,t,n,tmp;
group[0]=sum[0]=0;
for(i=1;i<MAX;i++){
group[i]=group[i-1]+1+(i/10>0)+(i/100>0)+(i/1000>0)+(i/10000>0);//相当于在求sk
sum[i]= sum[i-1]+group[i]; //在求s1+s2+...+sk
}
scanf("%d",&t);
while(t--){
scanf("%d",&n);
i = lower_bound(sum,sum+MAX,n)-sum;//在哪一组
j = n - sum[i-1];
i = lower_bound(group,group+MAX,j)-group;//在哪一个数中
sprintf(s,"%d",i);
j -= group[i-1];
printf("%c\n",s[j-1]);
}
return 0;
}