快速幂
顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
原理
以下以求a的b次方来介绍,把幂指数b转换成二进制数。该二进制数第i位的权为2^(i-1), 例如11的二进制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1。因此,我们将a¹¹转化为算
代码比较
1 2 3 4 5 6
| int pow1(int a,int b){ int r=1; while(b--) r*=a; return r; }
|
1 2 3 4 5 6 7 8 9 10
| int pow2(int a,int b){ int r=1,base=a; while(b!=0){ if(b%2) r*=base; base*=base; b/=2; } return r; }
|
1 2 3 4 5 6
| int f(int m,int n){ if(n==1) return m; int temp=f(m,n/2); return (n%2==0 ? 1 : m)*temp*temp; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| int pow3(int x,int n){ if(n==0) return 1; else { while((n&1)==0){ n>>=1; x*=x; } } int result=x; n>>=1; while(n!=0){ x*=x; if(n&1) result*=x; n>>=1; } return result; }
|
1 2 3 4 5 6 7 8 9 10
| 快速求幂(位运算,更简洁,跟一般快速幂是一样的,即pow2 ) int pow4(int a,int b){ int r=1,base=a; while(b){ if(b&1) r*=base; base*=base; b>>=1; } return r; }
|
快速幂取模
(ab)%c=(a%c)(b%c)%c
1 2 3 4 5 6 7 8 9 10 11 12
| int quick(int a,int b,int c) { int ans=1; a=a%c; while(b!=0) { if(b&1) ans=(ans*a)%c; b>>=1; a=(a*a)%c; } return ans; }
|
最后更新时间:
本文链接:
https://hankin2015.github.io/2017/12/16/20171216quick-pow/版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!