剑指Offer-16:数值的整数次方

题目:

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

问题解析:

  • 考察代码完整性的问题。要求有异常值的处理机制。

链接:

剑指Offer(第2版):P110

思路标签:

  • 边界值处理;
  • 异常值处理;

解答:

1. C++

全面但不高效的解法:

  • 使用全局标志变量来标识是否有错误发生;
  • 注意判断浮点数是否相等,不能简单的使用“==”来判断;
  • 注意指数为负数的情况。
  • 缺点是如果忘记去检查全局标识变量,就会留下安全隐患。
class Solution {
public:
    double Power(double base, int exponent) {
        if (equal(base, 0.0) && exponent < 0)
            return 0.0;

        unsigned int absExponent = (unsigned int)(exponent);
        if (exponent < 0)
            absExponent = (unsigned int)(-exponent);

        double result = PowerWithUnsignedExponent(base, absExponent);

        if (exponent < 0)
            result = 1.0 / result;

        return result;
    }

    double PowerWithUnsignedExponent(double base, unsigned int exponent) {
        double result = 1.0;
        for (int i = 1; i <= exponent; ++i)
            result *= base;

        return result;
    }

    bool equal(double num1, double num2)
    {
        if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
            return true;
        else
            return false;
    }
};

全面且高效的解法:

  • 对于指数的求法,我们可以知道求a的n次方:
  • 如果n为偶数:a^n = a^(n/2) * a^(n/2);
  • 如果n为奇数:a^n = a^((n-1)/2) * a^((n-1)/2) * a;
  • 所以,对核心函数进行优化。
double PowerWithUnsignedExponent(double base, unsigned int exponent) {
    if(exponent == 0) return 1;
    if(exponent == 1) return base;

    double result = PowerWithUnsignedExponent(base, exponent >> 1);
    result *= result;
    if(exponent & 1 == 1)
        result *= base;

    return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值