O(lg p)计算n^p

来源:互联网 发布:淘宝介入换货会怎么样 编辑:程序博客网 时间:2024/05/16 01:05

把指数转化为二进制,然后使用Scaling Method,时间复杂度为O(lg p)。

  1. unsigned power(unsigned n, unsigned p) 
  2.   unsigned k = 1; 
  3.   while (p>1) { 
  4.   if(0 != (p &1)) 
  5.   k *= n; 
  6.   n *= n; 
  7.   p /= 2; 
  8.   } 
  9.   return n*k; 
  10. int main(int argc, char *argv[]) 
  11.   int n, p; 
  12.   n = atoi(argv[1]); 
  13.   p = atoi(argv[2]); 
  14.   printf("power(%d,%d)=%d/n", n, p, power(n,p)); 

设n =  m, p = 110101

 第1次, k = m^1,n = m^10.

 第2次, k = m^1,n = m^100.

 第3次, k = m^1 * m^100 = m^101,n = m^1000.

 第4次, k = m^101,n = m^10000.

 第5次, k = m^101 * m^10000 = m^10101,n = m^100000.

 第6次, p = 1,  终止。

k*n = m^10101 * m^100000 = m ^ 110101。