快速幂 顾名思义 就是快速求幂的方法 再通俗的讲就是求 a^b 的快速方法
通常情况我们求a^b 就是求b个a相称 时间复杂度为O(n) 看起来已经很快了 只需遍历一遍就能求出结果 但是 这依旧不能满足我们的需求 我们希望有更快的方法来求得 a^b 结果 所以就有了快速幂
首先它的 时间复杂度是O(log₂N)
方法是 将b转化为二进制的形式进行求解 a^b
以 b=11 为例 即 a^11
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为
这样原先需要11次运算方法就转换成了3次运算
代码:
#include <stdio.h>
int Power(int a,int b){
int temp=1;
while (b){
if(b%2)// 将b逐位转化为二进制 并判断该为是0还是1 0则不需要乘进去
temp=(temp*a);
b/=2; // 相当于将b的二进制右移一位
a=a*a;// 求a的几次方
}
return temp;
}
int main (){
int a,b;
scanf ("%d%d",&a,&b);
printf ("%d\n",Power(a,b));
return 0;
}
将a^b 中的b转化为二进制形式后 求解的过程其实就是判断在b的每个二进制位上判断 a2^n
是否需要乘进最终结果
1 0 1 1
a8 a4 a2 a1
当b的二进制位位0是 不需要乘
所以代码中的 a=a*a 的作用就是求a的几次方
另外 大数运算时 类型可以改为 long long 并在求a 和 tamp 时进行取模
20万+

被折叠的 条评论
为什么被折叠?



