LeetCode 50. Pow(x, n) C++ 快速幂算法

Implement pow(x, n), which calculates x raised to the power n (xn).
实现 pow(x, n) ,即计算 x 的 n 次幂函数。

Example 1:

Input: 2.00000, 10
Output: 1024.00000

Example 2:

Input: 2.10000, 3
Output: 9.26100

Example 3:

Input: 2.00000, -2
Output: 0.25000
Explanation: 2-2 = 1/22 = 1/4 = 0.25

Note:

-100.0 < x < 100.0
n is a 32-bit signed integer, within the range [−231, 231 − 1]
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

快速幂算法

举个例子 计算 x77时利用递归的思想
按照这样的顺序来计算:
x —> x2 —> x4—> x9 —> x19 —> x38 —> x77

直接从左到右进行推导看上去很困难,因为在每一步中,我们不知道在将上一次的结果平方之后,还需不需要额外乘 x。但如果我们从右往左看,分治的思想就十分明显了:

  • 当我们要计算 xn时,我们可以先递归地计算出 y = xn/2 (其中n/2向下取整)
  • 根据递归计算的结果,如果 n 为偶数,那么 xn = y2 ,如果 n 为奇数,那么 xn = y2 * x
  • 递归的边界为 n = 0,任意数的 0 次方均为 1
  • 由于每次递归都会使得指数减少一半,因此递归的层数为 O(logn),算法可以在很快的时间内得到结果。

C++( O(logn) )

class Solution {
public:
    double myPow(double x, int n) {
        long long N = n;//避免溢出
        return N >= 0 ? quickmul(x, N) : 1.0 / quickmul(x, -N);
    }
    double quickmul(double x, long long n){
    	if(n == 0){
    		return 1;
		}
		double y = quickmul(x , n/2);
		return n%2 == 0 ? y * y : y * y * x; 
	}
};

参考:50. Pow(x, n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值