求超大次幂的算法,可将时间复杂度从O(N)降为 O(log?N)
百科里有很清晰的介绍:
http://baike.baidu.com/link?url=x4vZ0RoaOyeRqi9vT4vYICe6uy8SeHhB1i6cCHPHTWBEcbdzGG06G8McAymojBn9Aq_1-PU_CVsww39dvmyPI_
int pow4(int a,int b) { int r=1,base=a; while(b!=0) { if(b&1) r*=base; base*=base; b>>=1; } return r; }
这里有一个数学证明,用到了秦九韶算法
http://blog.csdn.net/lsldd/article/details/5506933
可以把b按二进制展开为:b = p(n)*2^n + p(n-1)*2^(n-1) +…+ p(1)*2 + p(0)
其中p(i) (0<=i<=n)为 0 或 1
这样 a^b = a^ (p(n)*2^n + p(n-1)*2^(n-1) +...+ p(1)*2 + p(0))
= a^(p(n)*2^n) * a^(p(n-1)*2^(n-1)) *...* a^(p(1)*2) * a^p(0)
对于p(i)=0的情况, a^(p(i) * 2^(i-1) ) = a^0 = 1,不用处理
我们要考虑的仅仅是p(i)=1的情况
化简:a^(2^i) = a^(2^(i-1) * 2) = ( a^( p(i) * 2^(i-1) ) )^2
(这里很重要!!具体请参阅秦九韶算法:http://baike.baidu.com/view/1431260.htm)
时间: 2024-10-08 05:19:11