心得:关于快速幂,个人认为这还是一个相对简单,不复杂的一个算法,只要能看懂题目意思,相关代码还是非常容易写的。
知识梳理:快速幂就是对位的运算,关于位运算的部分,我们可以逐位获取b的位,碰到0,就累乘,碰到1,就将累乘的值乘到答案。
int Pow(int a,int b){
int ans = 1;
int base = a;
while(b){
if(b & 1) ans *= base;
base *= base;
b >>= 1;
}
return ans;
}(关键代码)(if语句中的b & 1,也就是将b与1按位与,那么1的二进制是1,也就是说b除了最后一位,其他位都和0相与,那么得到的值一定都是0)(while循环中b >>= 1,是移位运算,将b向右移动1位。因为每次我们都是要获取最后一位,看是0还是1,那么每次移动1位,下一次在碰见if语句,就得到原来最后一位的前一位了)
快速幂取模:在快速幂的基础上,运用一个数学定理:(a^b) mod c = (a mod c)^b mod c就可以求得模长(ans=(ans*base)%d&&base=(base*base)%d)。
原文:https://www.cnblogs.com/cyz1593574682/p/12197756.html