题目描述
T组数据 输入N(1<=N<=1,000,000,000),给出N的N次方的首位数字。
样例
输入
2
3
4
输出
2
2
解题思路
显然不能暴力做,即使是用java的大数也会T到大学毕业…………
遇到这种题,要反应过来往数学上想。
N^N=10^(N*lgN)
我们知道N*lgN其实是可以用long long装下的,那么进一步考虑…………
是不是有一个公式 x = [x] + (x)?
[x]是地板函数也叫高斯函数 表示不超过x的最大整数 通俗来说就是x的整数部分
(x)=x-[x],也就是小数部分
回到题上来…………10^(N*lgN)不就是10^[N*lgN] * 10^(N*lgN)吗?
第一项10^[N*lgN]无非就是好多0,对最后的结果其实并没有影响!而且发现 10^(N*lgN)是在1到10之间的。因此最后强制转化一下类型,将小数甩掉就可以得到最终的结果了。
另外注意一下math库里的对数函数log10()表示lg 而log()表示求ln 不要记混了
下面贴一下代码
#include <cstdio>
#include <cmath>
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
double s = n*log10(n);
printf("%d\n",(int) pow(10.0,(s - (long long)s)));
}
return 0;
}