設2^n為x, 設x為10^y次方級的數(用科學計數法表示的后綴),要求的首位為f
那么
lg(x/10^y) = lg(f) lg是底為10的對數
上式可以變為 lg(x) - y = lg(f)
==> n*lg(2) - y = lg(f)
現在,只用求y即可,
其實, (int) y = lg(x) = lg(2^n) = n*lg(2),
看起來不是跟上一個相等嗎?但是注意y展開后是100000...的形式,所以我們在求出了它的對數之后,只取它的整數部分即可,即y是int型,所以……后面的不用推了,把f外面的對數符號拿過去就是了。
最后得到:
f = 10^(n*lg(2)- (int)(n*lg(2)))
同樣的,如果要求3、4、5...的n次方,只需要把2改為它們即可
P.S. 不過此算法在算2的3次方時會有誤差,還不清楚為什么?(準確地說,在冪n小的時候都有誤差)想請教一下各位大牛,謝謝啦~
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n;
while (scanf("%d", &n) && n!=-1) {
int y = (int) (n * log10(2.0));
double t = n * log10(2.0);
int ans = (int) (pow(10.0, t-(double)y) + 1e-8);
//n == 2 答案有誤差,在加上1e-8后,誤差消除
printf("%d\n", ans);
}
return 0;
}