HDU Leftmost Digit(求n^n最高位的數字)
題目大意是輸入N,求N^N的最高位數字。1<=N<=1,000,000,000
估計大家看到N的範圍就沒想法了。確實N的數字太大,如果想算出結果,即使不溢位也會超時。
這題我糾結了很久。在同學的提示下ac了。
題目是這樣轉化的。
首先用科學計數法來表示 N^N = a*10^x; 比如N = 3; 3^3 = 2.7 * 10^1;
我們要求的最右邊的數字就是(int)a,即a的整數部分;
OK, 然後兩邊同時取以10為底的對數 lg(N^N) = lg(a*10^x) ;
化簡 N*lg(N) = lg(a) + x;
繼續化 N*lg(N) - x = lg(a)
a = 10^(N*lg(N) - x);
現在就只有x是未知的了,如果能用n來表示x的話,這題就解出來了。
又因為,x是N^N的位數。比如 N^N = 1200 ==> x = 3; 實際上 x 就是 lg(N^N) 向下取整數,表示為[lg(N^N)]
ok a = 10^(N*lg(N) - [lg(N^N)]); 然後(int)a 就是答案了。
程式碼:
#include<iostream>
#include<math.h>
int main()
{
int n,m;
std::cin>>n;
while (n--)
{
std::cin>>m;
long double t
= m* log10 (m*1.0);
t -= ( __int64 )t;
__int64 ans = pow (( long double )10,
t);
std::cout<<ans<<std::endl;
}
return 0;
}
|
java版:
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
while(n-- != 0){
long T = cin.nextInt();//注意用長整型
double m = T * Math.log10(T);//java提供了log10、log2的方法
m = m - (long)m;
System.out.println((int)Math.pow(10, m));//取整數部分輸出即可
}
}
}