113:Pow(x,n)

题目:Implement pow(x, n).

解析1:使用递归法,因为 xn=(x2)n/2xn%2 ,代码如下:

// 递归法,时间复杂度 O(logn)
// 注意:-5 / 2 = -2, -5 % 2 = -1;
class Solution {
public:
        double myPow(double x, int n) {
                if (n < 0) return myPow_aux(1.0 / x, -n);
                // 事实上,n 是正数还是负数无关紧要;
                // n 的作用只是判断要迭代多少次;
                // 在这种情况下正数和对应的负数都能判断出相同的迭代次数;
                // 再者如果 n = INT_MIN, -n 也为 INT_MIN;
                // 所以从最终结果角度讲,没要必要把 n 写成 -n
                // 但为了便于理解,还是把 n 写成 -n。

                return myPow_aux(x, n);
        }
private:
        double myPow_aux(double x, int n)
                if (n == 0) return 1;
                else if (n % 2 != 0) return myPow(x * x, n / 2) * x;
                else return myPow(x * x, n / 2);
        }
};

解析2:迭代法,把幂指数 n 用二进制表示。代码如下:

// 迭代法,时间复杂度 O(logn)
class Solution {
public:
        double myPow(double x, int n) {
                if (n < 0) return myPow(1.0 / x, -n)
                // 事实上,n 是正数还是负数无关紧要;
                // n 的作用只是判断要迭代多少次;
                // 在这种情况下正数和对应的负数都能判断出相同的迭代次数;
                // 再者如果 n = INT_MIN, -n 也为 INT_MIN;
                // 所以从最终结果角度讲,没要必要把 n 写成 -n
                // 但为了便于理解,还是把 n 写成 -n。

                double result = 1;
                for (int i = 0; n; ++i) {
                        if (i != 0) x = x * x;
                        if (n % 2 != 0) result *= x;
                        n /= 2;
                }
                return result;
        }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值