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