剑指offer---数值的整数次方(重点)

这篇博客介绍了LeetCode上的一个问题——数值的整数次方,提供了两种解决方案。方法1通过for循环实现,考虑了指数为负数、0以及0的0次方的情况。方法2采用递归策略,将大指数拆分为小指数的平方,提高了效率。代码中还包含了一个用于比较浮点数相等的辅助函数。
摘要由CSDN通过智能技术生成

题目11:数值的整数次方(leetcode链接:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/

题目分析

方法1

利用for循环,expnent为多少就对base进行多少次迭代乘法运算。但是需要考虑下面特殊情况:

1)当expnent为负数,对expnent求绝对值,进行运算再将运算结果求倒数即可。

2)base 和 expnent都为0.0,0的0次方是没有意义的,可以返回0或1

3)当expnent为0时,返回1

4)当expnent为负数,且base为0时,对运算结果求倒数会导致0做分母(被除数)的问题。

方法2

递归求解,我们要求m^32时,我可以先求出m^16在对m^16求平方即可,依次类推求m^16又可以转化为m^8求平方问题。我们可以得到下面的公式

代码描述

方法1

bool equal(double x,double y){
    //浮点数不能直接比较大小,当浮点数超出精度范围后,编译器会自动截断超出精度部分,可能会导致两个本不相等的浮点数判断为相等
    //一般认为两个浮点数的差值小于0.0000001时两个浮点数就相等
    if(x - y > -0.0000001 && x-y < 0.0000001)
        return true;
    return false;
}
double myPow(double x, int n){
    double result = 1.0;
    //当x为0且n<0时,为了防止对0求倒数,直接返回0
    if(equal(x,0.0) && n < 0){
        return 0.0;
    }
    //当n < 0时,进行|n|次循环在求倒数
    int absN = abs(n);
    for(int i = 1;i <= absN;i++){
        //当x为0.0,n大于0时,result为0
        //当n=0,不会进入循环,返回1.0
        //当x为0且n为0,也不会进入循环,返回1.0
        result *= x;
    }
    if(n < 0)
        return 1.0/result;
    return result;
}

方法2

bool equal(double x,double y){
    //浮点数不能直接比较大小,当浮点数超出精度范围后,编译器会自动截断超出精度部分,可能会导致两个本不相等的浮点数判断为相等
    //一般认为两个浮点数的差值小于0.0000001时两个浮点数就相等
    if(x - y > -0.0000001 && x-y < 0.0000001)
        return true;
    return false;
}
double _power(double x,unsigned int n){
    if(n == 0){
        return 1;
    }
    if(n == 1)
        return x;
    double result = _power(x,n >> 1);
    result *= result;
    //判断n是否为奇数
    if(n & 1 == 1)
        result *= x;
    return result;
}
double myPow(double x, int n){
    double result = 1.0;
    //当x为0且n<0时,为了防止对0求倒数,直接返回0
    if(equal(x,0.0) && n < 0){
        return 0.0;
    }
    unsigned int absN = (unsigned int)n;
    if(n < 0){
        absN = -absN;
    }
    result = _power(x,absN);
    if(n < 0)
        return 1.0/result;
    return result;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

疯狂嘚程序猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值