HDU1060 leftmost digit
这是一道数学题。。
思路大概是这样:
m=n^n,两遍分别对10取对数得 log10(m)=n*log10(n),得m=10^(n*log10(n)),由于10的任何整数次幂首位一定为1,所以m的首位只和n*log10(n)的小数部分有关
//MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 #include <iostream> #include <cmath> using namespace std; typedef long long int64; int main() { int64 N,i,a,sum; double s,num,x; cin >> N; while ( N -- ) { cin >> num; s = num * log10 ( num ); a = ( int64 ) s; x = s - a; sum = ( int64 ) pow ( ( double ) 10, ( x ) ); cout << sum << endl; } return 0; }
以诚兄的代码:
#include <iostream> #include <math.h> using namespace std; int main() { int T; cin>>T; while(T--) { long long num; cin>>num; double x=num*log10((double)num); x-=(__int64)x; int a=(int)pow(10.0,x); cout<<a<<endl; } return 0; }
数学推导步骤如下:
num^num = 10^n * a (1<a<10) num * log10(num) = n + log10(a) (log10(a)>0) 令 x = num * log10(num) log10(a) = x - n (n=(int)x) log10(a) = x - (int)x a = 10^(x - (int)x)
因此,若要求出a ,只需先求得 x = num * log10(num) 然后取其小数部分 x - (int)x ,再作为10的幂,即可得到结果。