快速幂的原理是将指数拆解成01串的形式,然后从后往前扫,用一个基数(base)保存当前位所对应的值。如果在这一位是1:结果便乘上这个基数;否则不乘。
比如3^5,其中指数是5.拆成01串的形式是:
1 0 1
那么最后一位代表的是3的1次方。base = 3 因为此位是1,所以答案乘上该基数 ans *= base (一开始初始化ans = 1)
倒数第二位是3的2次方。base *= base(base = 9) 因为此位是0,所以答案并不乘上该层的基数。
第一位是3的4次方。base *= base (base = 81) 因为此位是1,所以答案乘上该基数 ans *= base
ans = 1 * 3 * 3 ^4 = 243。
代码实现(从别人哪里复制了过来)
- //普通快速幂
- int pow2(int a,int b)
- {
- int res = 1;
- int base = a;
- while(b > 0)
- {
- if(b % 2)
- res *= base;
- base *= base;
- b /= 2;
- }
- return res;
- }
- //位运算快速幂
- int pow3(int a,int b)
- {
- int r = 1, base = a;
- while(b != 0)
- {
- if(b & 1)
- r *= base;
- base *= base;
- b >>= 1;
- }
- return r;
- }