实现x的n次幂函数Pow(x,n)

文章介绍了两种解决计算x的n次方的方法,一是基于快速幂的递归实现,通过不断将指数折半来减少计算次数;二是迭代方式的快速幂,通过二进制拆分指数并逐步计算。两种方法都考虑了负指数和基线条件的情况,并提供了相应的代码实现。
摘要由CSDN通过智能技术生成

方法一即常用思路递归,注意基线条件即可,方法二参考力扣官方题解思路

方法一:快速幂 + 递归
解题思路
  • n为奇数
    x n = x n / 2 ∗ x n / 2 ∗ x x^{n} =x^{n/2}\ast x^{n/2}\ast x xn=xn/2xn/2x
  • n为偶数
    x n = x n / 2 ∗ x n / 2 x^{n} =x^{n/2}\ast x^{n/2} xn=xn/2xn/2
  • n为负数
    x − n = ( 1 / x ) n x^{-n} =(1/x)^{n} xn=(1/x)n
  • 基线条件为n等于0或1,分别为1和其自身
代码实现
func myPow(x float64, n int) float64 {
	if n == 0 {
		return 1
	} else if n == 1 {
		return x
	} else if n < 0 {
		n = -n
		x = 1 / x
	}
	cur := myPow(x, n/2)
	if n%2 == 0 {
		return cur * cur
	} else {
		return cur * cur * x
	}
}
力扣官方版本
func myPow(x float64, n int) float64 {
    if n >= 0 {
        return quickMul(x, n)
    }
    return 1.0 / quickMul(x, -n)
}

func quickMul(x float64, n int) float64 {
    if n == 0 {
        return 1
    }
    y := quickMul(x, n/2)
    if n%2 == 0 {
        return y * y
    }
    return y * y * x
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/powx-n/solutions/238559/powx-n-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法二:快速幂 + 迭代
解题思路

以x的69次方为例
x → x 2 → x 4 → x 8 ( x ) → x 17 → x 34 ( x ) → x 69 x\to x^{2} \to x^{4} \to x^{8}(x) \to x^{17} \to x^{34}(x)\to x^{69} xx2x4x8(x)x17x34(x)x69
69为奇数,第一次迭代需补乘一个x,最终结果为补乘一个x的2的0次方;17为奇数,第三次迭代需补乘一个x,最终结果中为补乘一个x的2的二次方,依此类推…总共迭代6次,第一个x在最终结果中为x的2的6次方,即x的64次方,1+4+64=69以上结果即如下规律:
69 : 1 → 0 → 0 → 0 → 1 → 0 → 1 69:1\to0 \to0 \to0 \to1 \to 0\to 1 691000101
69 = 2 6 + 2 2 + 2 0 69=2^{6} +2^{2} +2^{0} 69=26+22+20
x 69 = x 2 6 ∗ x 2 2 ∗ x 2 0 x^{69} =x^{2^{6}} *x^{2^{2}} *x^{2^{0} } x69=x26x22x20

代码实现
func myPow(x float64, n int) float64 {
	if n == 0 {
		return 1
	}
	if n == 1 {
		return x
	}
	if n < 0 {
		n = -n
		x = 1 / x
	}
	res := 1.0
	for n > 0 {
		if n%2 == 1 {
			res *= x
		}
		x *= x
		n /= 2
	}
	return res
}
力扣官方版本
func myPow(x float64, n int) float64 {
    if n >= 0 {
        return quickMul(x, n)
    }
    return 1.0 / quickMul(x, -n)
}

func quickMul(x float64, N int) float64 {
    ans := 1.0
    // 贡献的初始值为 x
    x_contribute := x
    // 在对 N 进行二进制拆分的同时计算答案
    for N > 0 {
        if N % 2 == 1 {
            // 如果 N 二进制表示的最低位为 1,那么需要计入贡献
            ans *= x_contribute
        }
        // 将贡献不断地平方
        x_contribute *= x_contribute
        // 舍弃 N 二进制表示的最低位,这样我们每次只要判断最低位即可
        N /= 2
    }
    return ans
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/powx-n/solutions/238559/powx-n-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值