設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;
}