1. 程式人生 > >hdu 1060 Leftmost digit(思維)

hdu 1060 Leftmost digit(思維)

題意,輸入一個n,求n^n的最高位是多少
當時比賽的時候,有嘗試思考過,直接乘肯定不行,大數乘法想想也會超時,就感覺可能需要一種數學的方法。但是沒有想到這個數學的方法。
賽後查到了這個數學方法,簡單的描述一下。對任意一個數,如果以10為底,取他的對數,得出來的數的整數部分就是他的位數,小數部分作為10的冪,得出來的數就是最高位的數字。

於是這個數學方法就是對m^m取對數mlg(m),取這個數的小數部分,再pow一下,就可以了。
程式碼很簡單,但是需要注意到的是這道題的精度問題很重要,我WA了兩次,估計都是精度問題。後來改了幾個位置的資料型別,不知道為什麼就過了。

#include<iostream>
#include<cmath> using namespace std; int main() { int n; cin>>n; while(n--) { int m; double num; int left; int zs; cin>>m; num=m*log10(double(m)); left=pow(10.0,num-floor(num)); cout<<left<<endl; } }