poj Number Sequence(数学)

计算一个十进制数的位数    (int)log10((double)i) + 1
#include <stdio.h>
#include <cmath>
unsigned int a[32000], s[32000];
void table()
{
    int i;
    a[1] = 1;
    s[1] = 1;
    for(i = 2; i < 31270; i++)
    {
        a[i] = a[i-1] + (int)log10((double)i) + 1;    //第i组数字的个数,120算是三个
        s[i] = s[i-1] + a[i];                        //前i组数字的个数  
    }
}
int solve(unsigned int n)
{
    int i = 1,pos;
    int length = 0;
    while (s[i] < n) i++;
    pos = n - s[i-1];
    for (i = 1; length < pos; i++)
        length += (int)log10((double)i) + 1;
    return ( (i-1)/(int)pow((double)10,length-pos) )%10;
}
int main()
{
    int t;
    unsigned int n;
    table();
    scanf("%d",&t);
    while(t--)
    {
        scanf("%u",&n);
        printf( "%d\n",solve(n) );
    }
    return 0;
}
posted @ 2014-01-17 11:26  单调的幸福  阅读(219)  评论(0编辑  收藏  举报