Leetcode50. Pow(x, n)

本文深入解析LeetCode第50题Pow(x,n)的算法实现,探讨了暴力法、递归法及迭代法三种解题策略,并提供了Java与Scala语言的具体代码实现,帮助读者理解如何高效计算x的n次幂。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Leetcode50. Pow(x, n)

题目:
实现 pow(x, n) ,即计算 x 的 n 次幂函数。

示例 1:

输入: 2.00000, 10
输出: 1024.00000

示例 2:

输入: 2.10000, 3
输出: 9.26100

示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25

说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

题解:
方案一:暴力法:循环遍历
方案二:先计算xn/2x^{n/2}xn/2,

  • 如果nnn为偶数,根据xn=(xn/2)2x^n=(x^{n/2})^2xn=(xn/2)2,计算得到xnx^nxn;
  • 如果nnn为奇数,根据xn=(x(n−1)/2)2∗xx^n=(x^{(n-1)/2})^2*xxn=(x(n1)/2)2x,计算得到xnx^nxn

java代码:

 public static double pow(double x, int n) {
        if (n < 0) {
            x = x / 1;
            n = -n;
        }
        return fastPow(x, n);


    }

    private static double fastPow(double x, int n) {
        if (n == 0) return 1;
        double d = fastPow(x, n / 2);
        if (n % 2 == 0) {
            return d * d;
        } else {
            return d * d * x;
        }
    }


    public static double pow2(double x, int n) {
        if (n == 0) return 1;
        if (n < 0) {
            x = 1 / x;
            n = -n;
        }
        double result = 1.0;
        while (n > 0) {
            if (n % 2 == 1) {
                result = result * x;
            }
            x = x * x;
            n = n / 2;
        }

        return result;
    }

scala代码:

 /**
    * 暴力算法
    *
    * @param x
    * @param n
    * @return
    */
  def myPow(x: Double, n: Int): Double = {
    var x1 = x
    var n1 = n
    if (n1 < 0) {
      x1 = 1 / x1
      n1 = -n1
    }
    var result = 1.0
    for (i <- 0 until n1) {
      result = result * x1
    }
    result
  }

  /**
    * 递归n
    *
    * @param x
    * @param n
    * @return
    */
  def myPow2(x: Double, n: Int): Double = {

    var x1 = x
    var n1: Long = n
    if (n1 < 0) {
      x1 = 1 / x1
      n1 = -n1
    }
    fastPow(x1, n1)

  }

  def fastPow(x: Double, n: Long): Double = {

    if (n == 0) 1.0
    else {
      val d = fastPow(x, n / 2)
      if (n % 2 == 0) {
        d * d
      } else {
        d * d * x
      }
    }
  }

  /**
    * 迭代
    *
    * @param x
    * @param n
    * @return
    */
  def myPow3(x: Double, n: Int): Double = {

    var x1 = x
    var n1: Long = n
    if (n1 < 0) {
      x1 = 1 / x1
      n1 = -n1
    }
    var result = 1.0
    var current_product = x1
    var i: Long = n1
    while (i > 0) {
      if (i % 2 == 1) {
        result = result * current_product
      }
      current_product = current_product * current_product
      i = i / 2
    }
    result
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值