1019 Number Sequence 数论
来源:互联网 发布:推荐淘宝上的韩国泡菜 编辑:程序博客网 时间:2024/05/21 10:38
#include <stdio.h>#include <math.h>#define N 31269unsigned a[N+1]; //a[i] 表示前i组数字序列的长度void init(){ a[1]=1; for (int i=2; i<N; i++) a[i]=a[i-1]+(int)log10((double)i)+1; //log10(i)+1 表示第i组数字列的长度 比 第i-1组 长的位数 for (int i=2; i<N; i++) a[i]+=a[i-1]; return;}int main(){ init(); int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); int k=1; while (a[k]<n) k++; //确定整个数字序列的第n个位置出现在第k组 int pos=n-a[k-1],len=0; //pos为 整个数字序列的第n个位置 在 第i组中的下标值 for (k=1; len<pos; k++) //从第1组开始遍历第i前的每一个组,利用log10(k)+1递推第i组的长度 len+=(int)log10((double)k)+1; //len为第k组(n所在的组)的长度 printf("%d\n",(k-1)/(int)pow((double)10,len-pos)%10); //之所以i-1,是因为前面寻找第i组长度时,i++多执行了一次 //i=i-1 此时i刚好等于第n位个置上的数 (数是整体,例如123一百二十三,i刚好等于123,但n指向的可能是1,2或3) //pos为n指向的数字在第i组中的下标值 //len为第i组的长度 //那么len-pos就是第i组中pos位置后多余的数字位数 //则若要取出pos位上的数字,就要利用(i-1)/pow(10,len-pos)先删除pos后多余的数字 //再对剩下的数字取模,就可以得到pos //例如要取出1234的2,那么多余的位数有2位:34。那么用1234 / 10^2,得到12,再对12取模10,就得到2 } return 0;}