美文网首页
面试题16:数值的整数次方

面试题16:数值的整数次方

作者: 修司敦 | 来源:发表于2018-11-19 22:34 被阅读0次
    实现函数 double Power(double base, int exponent),求 base 的 exponent 次方。不得使用库函数,同时不需要考虑大数问题。

    解析:该题需要首先考虑底数为 0 的情况,当指数也为 0 的时候是非法输入,和面试馆要商量好计算结果,我这里是 1.0;当指数为负数的时候也是非法输入,因为 0^{-3} = 1.0/(0^3) = 1.0/0 = undefined;当指数为正数的时候可以安全返回 0.0。底数为 0 的情况考虑结束之后,如果指数是负数,那就先计算指数是正数的结果,然后将最后结果的倒数返回;如果指数是正数就返回计算结果就好。计算的方法是经典的快速幂求法:将指数不断右移一位,将结果翻一番,直到指数变为1,将结果乘以底数并返回。注意,使用右移的速度要比除以 2 要快。


    答案:

    bool g_InvalidInput = false;
    bool equal(double num1, double num2);
    double PowerWithUnsignedExponent(double base, unsigned int exponent);
    
    double Power(double base, int exponent)
    {
        //由于测试是连续的,上一次的全局变量可能被置为 true,所以这个时候要还原
        g_InvalidInput = false; 
        if (equal(base, 0.0))
        {
            if (exponent == 0)
            {
                g_InvalidInput = true;
                return 1.0;//和面试官约定好返回数值
            }
            else if (exponent < 0)
            {
                g_InvalidInput = true;// 0 的负数次方会导致除 0,所以是非法
                return 0.0;
            }
            else return 0.0;
        }
    
        unsigned int absExp = exponent>=0 ?
                static_cast<unsigned int>(exponent) :
                static_cast<unsigned int>(-exponent);
        double res = PowerWithUnsignedExponent(base, absExp);
        if (exponent<0) return 1.0/res;
        else return res;
    }
    
    double PowerWithUnsignedExponent(double base, unsigned int exponent)
    {
        if (exponent == 0) return 1.0;
        if (exponent == 1) return base;
        if (exponent == 2) return base * base;
    
        unsigned int exp = exponent;
        double ret = base;
        while (exp >= 2)
        {
            exp >>= 1;
            ret *= ret;
        }
        if (exp == 1) ret *= base;
        return ret;
    }
    
    bool equal(double num1, double num2)
    {
        //将差值的绝对值控制在 0.0000001 之内
        return (num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001);
    }
    

    相关文章

      网友评论

          本文标题:面试题16:数值的整数次方

          本文链接:https://www.haomeiwen.com/subject/nuszfqtx.html