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