2021-10-05

快速幂

问题:实现 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)有意义而设置的 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值