快速幂
问题:实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。其中-231 <= n <= 2^31-1
**递归实现
算法思想:比如计算x的n次幂(n为偶数),可以先做x的n/2次幂,这样由二分的思想可以将算法复杂度降到log(n)
但同时还有很多细节需要考虑:
1)幂次为奇数如何处理,可以先算幂次的一半,然后再乘以底数
2)如果n为负数如何处理,可以将参数设置为-n,然后最后返回结果的倒数
`#include<iostream>
using namespace std;
class Solution {
public:
double quickMul(double x, long long N) {
if (N == 0) {
return 1.0;
}
double y = quickMul(x, N / 2);
return N % 2 == 0 ? y * y : y * y * x;
}
double myPow(double x, int n) {
long long N = n;
return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
}
};
int main(){
int x,n;
cin>>x>>n;
Solution s;
cout<<s.myPow(x,n);
}`**
迭代实现
算法思想:将N进行二进制拆分,x的N次幂就可以写成x的每个二进制位次幂之积
#include<iostream>
using namespace std;
double quickmul(int x,long long N){
double ans=1.0;//1.0
int x_contribute=x;
while(N>0){
if(N%2==1){
ans*=x_contribute;
}
x_contribute*=x_contribute;
N/=2;
}
return ans;
}
double mypow(int x,int n){//double
long long N=n;
return N>0? quickmul(x,N): 1.0/quickmul(x,-N);//1.0
}
int main(){
int x,n;
cin>>x>>n;
cout<<mypow(x,n);
}//注释都是为了 1.0/quickmul(x,-N)有意义而设置的