数值的整数次方

数值的整数次方

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 —— [ 牛客网 ]

本题目考察的是代码的完整性,实现求方的函数,需要考虑程序的边界值。首先需要想到的特殊的情况有以下的几个方面:

  • exponent为0,base不为0,结果为1
  • exponent为0,base为0,这种情况实际情况中并不存在,可选择抛出异常或者返回特定值
  • exponent为正,base为0,结果返回0
  • exponent为负,base为0,结果应该抛出异常或者返回特定值

考虑以上的特殊情况,要考虑exponent的正负两种情况,计算公式如下:

be={be,1/be,if e is positive if e is negative

而题目让实现求幂的计算方法,按照最常规的思路,则有以下的代码。

解法一
class Solution {
public:
    double Power(double base, int exponent) {        
        if(base == 0 && exponent != 0)return 0;
        if(base != 0 && exponent == 0)return 1;
        if(base == 0 && exponent == 0)return 1;
        if(base == 1)return 1;

        double ans = 1.0;
        int n = abs(exponent);
        for(int i = 1 ;i <= n ; i++ ){
            ans *= base;
        }

        return exponent > 0 ? ans : 1/ans;
    }    
};

进一步的思考

针对数值求幂的运算,可以用更快的算法,而我们使用的思路一是如下所示:

bn={bn/2bn/2,bn1/2bn1/2b,if e is odd if e is even

思路二用另一种表达方式可以看作是,假设 n=5 n 的二进制表示101,那么
b101=b1100b0010b1001=(b4)1(b2)0(b1)1

若判断每一位是0,还是1,选择是否乘以相应的数值,这也是用移位和与与运算实现思路一。

解法二
class Solution {
public:
    double Power(double base, int exponent) {        
        if(base == 0 && exponent != 0)return 0;
        if(base != 0 && exponent == 0)return 1;
        if(base == 0 && exponent == 0)return 1;
        if(base == 1)return 1;

        double ans = 1.0;
        int n = abs(exponent);
        double curr = base;
        while(n){
            if(n & 1)ans *= curr;
            curr *= curr;
            n >>= 1;
        }

        return exponent > 0 ? ans : 1/ans;
    }

};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值