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的幂,即可得到结果。

浙公网安备 33010602011771号