1. 程式人生 > >HDU Leftmost Digit(求n^n最高位的數字)

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));//取整數部分輸出即可
  }
  
 }
}