要理解base*=base这一步:因为 base*base==base2,下一步再乘,就是base2*base2==base4,然后同理 base4*base4=base8,由此可以做到base-->base2-->base4-->base8-->base16-->base32.......指数正是 2^i ,再看上面的例子,a¹¹= a1*a2*a8,这三项就可以完美解决了,快速幂就是这样。
常规求幂
1 2 3 4 5 | int pow1( int a, int b){ int r=1; while (b--) r*=a; return r; } |
快速求幂(一般)
1 2 3 4 5 6 7 8 9 | 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 | int f( int m, int n){ //m^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 | 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 | int pow4( int a, int b){ int r=1,base=a; while (b){ if (b&1) r*=base; base*=base; b>>=1; } return r; } |