[LeetCode] 求一个数的n次方 power

求一个数的n次方。

非递归算法:

 

unsigned Power( unsigned n, unsigned p )
{
    // 计算n的p次
    // 把p表示成二进制形式。例如,p=101010
    // n^(10) = ( n^(1) )^2
    // n^(110) = n^(100)*n^(10) = ( ( n^(1) )^2 )^2 * n^(10)
    unsigned k = 1; 
    while ( p > 1 )
    {
        if ( 0 != ( p & 1 ) )
        {
            // 判断p是否为奇数
            k *= n; 
        }
         n *= n;  // 主体乘方
         p /= 2;  // 指数除以2
    }
     return n * k; 
}
上面的算法只适用于p>1的情况。

 

 

递归算法(divide and conquer):

power(a, n)  = power(a, n/2) * power(a, n/2)                        if n is even;
                         power(a, (n–1)/2) * power(a, (n–1)/2) * a    if n is odd.

递归复杂度方程:T(n) = T(n/2) +1。复杂度:log(n)。下面的算法考虑了n为负数的情况.

 

    double pow(double x, int n) {
        if(n<0)
            return 1.0/pow(x, -n);

        if( n == 0)
           return 1;

        double temp = pow(x, n/2);

        if (n%2 == 0)
            return temp*temp;
        else
            return x*temp*temp;

    }   

当n为负数时,我们求1.0/pow(x, -n)。但是n=-2^(-31)时,-n会溢出(32bit有符号整数的范围是-2^(-31) ~ 2^31)-1)。下面是更安全的算法, 不对n求-n。。

double pow(double x, int n)
{
    if( n == 0)
       return 1;
    
    double temp = pow(x, n/2);   
    
    if (n%2 == 0)
        return temp*temp;
    else
    {
        if(n > 0)
            return x*temp*temp;
        else
            return (temp*temp)/x;
    }
} 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值