题目描述:
Given a positive integer N, you should output the leftmost digit of N^N.
题目分析:
由于N给的数据是10^9,很显然将N一个个乘起来那就是你不想活了啊。一般对于a^b我们是进行取对数,这道题也不例外。
题目转化:
设 M = N^N , 等式两边去对数 log10
log10 ( M ) = log10 ( N^N ) = N * log10 ( N )
再化简过去 可得: M = 10 ^( N*log10(N) )
我们假设 N * log10( N ) = A + B (其中A为整数部分,B为小数部分)
则有 M = 10^A + 10^B , 对于整数A, 则10^A必定为 100...0的形式, 而对于10^B ,因为B = [0,1) 所以10^B 属于 [ 1,10 )区间
可以得出,对与M的最左边有影响的只有 10^B ,所以结果为 pow( 10 , N*log10(N) - floor( N*log10(N) ) )
代码:
View Code
1 #include"stdio.h" 2 #include"math.h" 3 int main() 4 { 5 int t,n; 6 scanf("%d",&t); 7 while(t--) 8 { 9 double a; 10 int b; 11 scanf("%d",&n); 12 a=n*1.0*log10(n)-floor(n*1.0*log10(n)); 13 b=floor(pow(10,a)); 14 printf("%d\n",b); 15 } 16 return 0; 17 }