二分法 Pow(x, n)

思想:

二分法。

如果n是奇数,x^n = x^(n/2) * x^(n/2) * x ;

如果n是偶数,x^n = x^(n/2) * x^(n/2) ;


class Solution {
public:
    //Pow(x, n)
    double func(double x, int n) {
        if(n == 0) return 1;
        double mid = func(x,n/2);
        if(n & 0x1) {
            return mid*mid*x;
        }else {
            return mid*mid;
        }
    }
    double myPow(double x, int n) {
        if(n < 0) return 1.0/func(x,-n);
        else return func(x,n);
    }
};



计算x的n次方有多种方法,以下为你详细介绍: ### 递归方法 递归方法的思路是基于数学定义,$x^n = x \times x^{n - 1}$(当$n > 0$),且$x^0 = 1$。以下是C语言实现代码: ```c #include <stdio.h> long power1(int x, int n) { return (n == 1)? x : x * power1(x, n - 1); } int main(void) { int x = 2, n = 23; printf("power1: %d %d result=%ld\n", x, n, power1(x, n)); return 0; } ``` 在上述代码中,`power1`函数通过递归不断将问题规模缩小,直到$n$为1时返回$x$,进而计算出$x$的$n$次方 [^1]。 ### 非递归方法 非递归方法使用循环,通过不断累乘来计算$x$的$n$次方。以下是C语言实现代码: ```c #include <stdio.h> long power2(int x, int n) { int i; long result = 1; for(i = 1; i <= n; i++) { result *= x; } return result; } int main(void) { int x = 2, n = 23; printf("power2: %d %d result=%ld\n", x, n, power2(x, n)); return 0; } ``` 在这段代码里,`power2`函数利用`for`循环,从1到$n$,每次将结果乘以$x$,最终得到$x$的$n$次方 [^1]。 ### 二分法(快速幂算法) 二分法利用了$x^n$的性质,当$n$为偶数时,$x^n = (x^{n/2})^2$;当$n$为奇数时,$x^n = x \times (x^{n - 1})$。以下是C语言实现代码: ```c #include <stdio.h> long power3(int x, int n) { long res = 1L; while(n) { if(n & 1L) res *= x; x *= x; n >>= 1; } return res; } int main(void) { int x = 2, n = 23; printf("power3: %d %d result=%ld\n", x, n, power3(x, n)); return 0; } ``` `power3`函数通过位运算判断$n$的奇偶性,将$n$不断右移,同时更新$x$的值,减少了乘法运算的次数,提高了效率 [^1]。 ### 库函数方法 在C语言中,可以使用`<math.h>`头文件中的`pow`函数来计算$x$的$n$次方。以下是示例代码: ```c #include <stdio.h> #include <math.h> int main() { double x = 2, n = 3; printf("pow()=%f\n", pow(x, n)); return 0; } ``` 在上述代码中,直接调用`pow`函数计算$x$的$n$次方 [^3]。 ### Java递归方法 在Java中可以通过递归实现计算$x$的$n$次方。示例代码如下: ```java public class PowerCalculation { public static double calculatePower(double x, int n) { if (n == 0) { return 1.0; } else if (n > 0) { return x * calculatePower(x, n - 1); } else { return 1 / calculatePower(x, -n); } } public static void main(String[] args) { double x = 2; int n = 3; System.out.println(calculatePower(x, n)); } } ``` 在这个Java程序里,`calculatePower`方法根据$n$的值进行不同处理,$n$为0时返回1,$n$大于0时递归调用自身计算,$n$小于0时计算倒数 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值