剑指offer——数值的整数次方

本文介绍了一种利用递归优化算法解决给定double型浮点数和int型整数次方问题的方法,通过将大指数分解为较小的指数计算,降低了时间复杂度至O(logn),并处理了负数和零基底的情况。
摘要由CSDN通过智能技术生成

题目描述:给定一个double类型的浮点数base和int类型的整数exponet。求base的exponet次方。保证base和exponet不同时位0。

示例1:

输入:2.00000,3

返回值:8.00000

示例2:

输入:2.10000,3

返回值:9.26100

思路及解答:

如果使用暴力解法,就是不断相乘,对于负数而言,则是相除,并且符号取反。

Java代码实现如下所示:

public class Solution{
    public double Power(double b, int n){
        if(n < 0){
            b = 1 / b;
            n = -n;
        }
        double result = 1.0;
        for(int i = 0 ; i < n ; ++i){
            result *= b;
        }
        return result;
    } 
}

题目中的double类型应该不能拆解,但是int类型的整数exponet我们可以考虑换个思路,我们平时求解次方的时候,假设有个X的4次方,我们通常是求出一个X的平方数,然后两个X平方相乘得出X的四次方。这里使用递归的方法,同时考虑边界条件如果指数是负数,则先取反,然后取结果的倒数即可。

$$ Power(base,ex)=\begin{cases} base*Power(base,ex-1),ex取余2=1 \ Power(base,ex/2)*Power(base,ex/2),ex取余2=0\ \end{cases} $$

Java代码实现如下所示:

public double Power(double base, int exponent) {
    if (exponent == 0) {
    // 指数为0则直接返回1
        return 1;
    }
    if (base == 0) {
     //底数为0直接返回0
        return 0;
     }
    // 判断指数是否为负数
    boolean isNegative = false;
    if (exponent < 1) {
        exponent = -exponent;
        isNegative = true;
    }
    double result;
    if (exponent % 2 == 1) {
        result = base * Power(base, exponent - 1);
    }else {
        double temp = Power(base, exponent / 2);
        result = temp * temp;
    }
        return isNegative ? (1.0 / result) : result;
}

时间复杂度:O(logn),每次计算后规模缩小一半 空间复杂度:O(logn),递归的时候,栈需要用到变量

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅亦予

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值