快速幂(fastpow)

一般的求幂方法.for循环:

//求a的n次方
for(int i = 1;i <= n;i++){
	result *= a;
}

但是很明显,这样的求幂方式只能满足很小范围内的求解,因此我们需要寻求更加快速的纠结方法,fastpow(快速幂)
快速幂是运用幂的一些运算所实现的快速求幂的方法
首先我们知道:当n为偶数时,a^n可以被分解为 a^(n/2) * a^(n/2)
当n为奇数时,a^n 可以被分解为 a^(n/2) * a(n/2) * a
所以这个有啥用呢,我们先来看个例子:
求2^9
2^9 = 2^4 * 2^4 * 2
2^9 = (2^2 * 2^2 )* (2^2 * 2^2 )*2
动画演示:
在这里插入图片描述

那你看,随着指数的不断减小,我们是不是就可以以更少一的运算得出结果,我们是不是只需要求出2的2次方我们就可以 直接用3次计算就可以算出2^9,有人说,怎么是3次呢,我们来看哈,第一次求出 2^2,根据 2^2求出 2^4,第三次根据 2^4 并且在乘2求出2^9;这是不是3次了呢,别看这才缩小了这几步运算,在数量级比较大的运算时,他的速度才更加突出
上代码:

int fastpow(int base,int pow){
	int ans = 1;//用来记录最终答案的
	while(pow) {
		if(n%2!=0)//如果指数不为偶数,那我们就把多出的哪一个底数直接乘在底数上 
			ans = ans * base;
		base  = base*base;//指数减小,那么底数就要扩大
		pow = pow/2;
	}
	return n;
}

但是我们发现这个代码还是有可以完善的地方,因为对于计算机,所有运算都是基于二进制以及位移运算进行的,我们如果直接用位移运算那么将会更加大幅度的提高代码的运行效率,因此我们可以该进成以下代码:

int fastpow (int base,int pow) {
	int ans = 1;
	while(pow) {
		if(pow&1)//此处等价于if(power%2==1)
			ans *= base;
		 power >>= 1;//此处等价于power=power/2
         base = base * base;
	}
	return ans;
}

一般情况下,求解快速幂还需要我们进行取模运算,我们可以在每次运算过程中就进行取模

图片来源博主:https://blog.csdn.net/qq_19782019/article/details/85621386
之前也是这这个博主这里学习的,看不懂的可以到这个博主这里看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值