快速幂问题

快速幂问题

幂运算是常遇到的一种问题

实现幂运算最简单的思路是暴力循环,复杂度为O(N)

优化–减少乘的次数

首先我们可以不进行n次计算 而是把其中的一些合成一部分来做

例如:求2的10次方,可以求2的2次方 * 2的2次方 * 五次

本来需要进行10次计算,现在需要进行6次

实现–利用二进制迭代实现快速幂

因为计算机是由二进制存储的 所以利用二进制实现快速幂更为方便

例如 10 的二进制表示为 1010

我们计算2的十次方也就是2 的 1010 次方 = 2的8次方+2的2次方

ans:存储计算得到的值

当b大于0的时候循环计算

将b与1做位运算,每次右移一位意思是判断当前位是不是1

#include<bits/stdc++.h>
using namespace std;

//二进制实现快速幂
int binaryPow(int a,int b){
	int ans =1;
	while(b>0){
		if (b&1){
			ans = ans*a; //令ans累计a 
			cout<<"ans:"<<ans<<" ";
		}
		a= a*a; 
		cout<<"a:"<<a<<" ";
		b>>= 1;
		cout<<"b:"<<b<<" ";
		cout<<endl;
	}
	return ans;
} 

int main(){
 int n = 0;
 n = binaryPow(2,10);
 cout<<n<<endl;
 
return 0;
}

例如计算2的10次方的计算过程

b b&1 ans a

10 \ 1 a

1010 0 1 a的2次方

101 1 1*a的2次方 a的4次方

10 0 a的2次方 a的8次方

1 1 a的2次方*a的8次方 a的16次方

null

ans = a的10次方

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值