快速幂

(1)递归方法

根据幂运算的性质,可以得出:
在这里插入图片描述
计算a的n次方,如果n是偶数(不为0),那么就先计算a的n/2次方,然后平方;如果n是奇数,那么就先计算a的n-1次方,再乘上a;递归出口是a的0次方为1。

根据以上原理可以得出递归的方法。递归方法时间复杂度为logn,递归不可避免的带来空间消耗

int myPow(int a, int n){
	if(n == 0){
		return 1;
	}else if(n % 2 == 1){
		return myPow(a, n-1) * a;
	}else{
		int temp = myPow(a, n / 2);
		return temp * temp;
	}
}

(2) 非递归方法

我们换一个角度来引入非递归的快速幂。还是7的10次方,但这次,我们把10写成二进制的形式,也就是(1010)2

现在我们要计算7^(1010)2,可以怎么做?我们很自然地想到可以把它拆分为 [公式] . 实际上,对于任意的整数,我们都可以把它拆成若干个7^(100…)
的形式相乘。而这些7 ^ (100…),恰好就是 7^1 、 7^2 、 7^4 ……我们只需不断把底数平方就可以算出它们。

int myPow(int a, int n){
	int ans = 1;
	while(n != 0){
		if(a & 1 != 0){
			ans *= a;
		}
		a *= a;
		n >>=  1;
	}
	return ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值