求a的n次方

此题面试时常有:

解答方法有以下三种:

1。 直接迭代求解,这个很简单,复杂度O(n)。

1。 分治法。复杂度 logn

此方法有点凹,原理是:a的n次方可以分别对应两种情况:

1。 n为偶数  那么 an= (a*a)n/2 

2。n为奇数 那么  an=  a*an-1

代码如下:


int power(int a ,int n)
{
     
if(n == 0)
          
return 1;
     
if(n&1)
          
return a*power(a,n-1);
     
else
          
return power(a*a,n>>1);
}

 

3.此方法复杂度为 n的二进制表示中最高位1的index

原理为:事先建立a的 2m m为(0,x);的表。指导找到一个最小的x使得 n<2X然后 利用a中二进制位的位置和个数信息得到最终结果

#define MAX 32
int my_pow(int a,int n)
{
    
if (a == 1  )
    {
        
return 1;
    }
    
if (n ==0)
    {
        
if (a == 0)
            
return -1;
        
return 1 ;
    }
    unsigned 
int table[MAX];
    table[
0= a; 
    
for (int i = 1;i<MAX && i<n;i++)
    {
        table[i] 
= table[i-1]*table[i-1];
    }
    i 
= 0;
    
int m = 1;
    
while ( n>>i)
    {
        
if(1&n>>i)
            m 
= m *table[i];
        i
++;
    }
    
return m;
}

 

 

 

posted @ 2010-08-14 17:41  David Luo  阅读(1607)  评论(0编辑  收藏  举报