首页 > 代码库 > hdoj 1060

hdoj 1060

代码:

#include <stdio.h>
#include <math.h>

int main()
{
    int t;
    while(scanf("%d",&t)!=EOF)
    {
        while(t--)
        {
            __int64 n;
            scanf("%I64d",&n);
            double x=n*log10(n*1.0);
            x-=(__int64)x;
            __int64 a=pow(10.0, x);
            printf("%I64d\n",a);
        }
    }
    return 0;
}

要点:这道题的输入数据最大为1000000000,而且是求n^n,所以任何数据都不能用来存放n^n的结果,

考虑到用科学技术法表示一个数,可有以下推导:

x=n^n=a*10^m;// 要求x的最大位数,即求a的第一位数字;

lg(x)=n*lg(n)=m+lg(a);// 取对数,0<a<10,0<lg(a)<1,对n*lg(n)取整可得到m;

lg(a)=lg(x)-m;

a=pow(10,n*1g(n)-m);

最后取a整数部分即可。