我曾经的一个同学曾今写的一个奇奇怪怪的算法,O(1)q求X的n次方,大致思路就是先求出a = (log2X) * y,然后将a拆为整数部分ia和小数部分fa,然后ans = (1 << ia) * pow(2,fa)
理论上来说复杂度是O(1)的,但是总感觉有什么不对,就是如果不考虑精度的话这个算法有问题嘛?
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("tst.in","r",stdin);
freopen("tst.out","w",stdout);
int x,y;
cin >> x >> y;
double logii = log(x) / log(2);
// cout << logii << endl;
// cout << (pow(2,logii)) << endl;
logii *= y;
// cout << (pow(2,logii)) << endl;
int inlogii = (int)logii;
logii -= inlogii;
// cout << (pow(2,logii)) << endl;
// cout << (pow(2,inlogii)) << endl;
// cout << (pow(2,logii)) * (pow(2,inlogii)) << endl;
int ans = 1;
double anss = pow(2,logii);
ans = ans << inlogii;
// cout << ans << endl;
// cout << ans * anss << endl;
if(logii > 0)
ans = ans * anss;
cout << ans;
return 0;
}