第二次做到,还是没搞清楚,记录一下。数学啊!
题目:计算N^N的最高位的值。1<=N<=1,000,000,000
思路:因为N会很大,所以N^N必然是会溢出,所以不能先求出N^N的值,再去求最高位。
1.求出N^N的以10为底的对数的小数部分,k = N*log10(N) - floor(N*log(N));//floor()向下取整
2.N^N的最高位 = 10^k;
以上就是公式,不过重要的还是要解决一下为什么,才能理解深刻些。
解析:一个数M,M 可以表示为 10^log10(M)= 10^(a+b) = 10^a*10^b, a为指数的整数部分,b为指数的小数部分。可以知道10^a就是1,10,100...(a = 0,1,2...)。我们知道一个数除以10^c(假设c就是M的位数-1)结果取整就是该数的最高位了。可知,a是等于c的,很明显,M 除以10^a等于10^b,所以10^b结果取整就是M的最高位了。
程序如下:
#include <stdio.h>
#include <math.h>
int main()
{
int t,n;
double k;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
k = n * (log10(n)) - floor(n * (log10(n)));
k = pow(10.0,k);
printf("%d\n",(int)k);
}
return 0;
}