一般的求幂方法.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
之前也是这这个博主这里学习的,看不懂的可以到这个博主这里看