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;}

原创粉丝点击