剑指offer——面试题11:数值的整数次方

来源:互联网 发布:苹果mac输入法设置 编辑:程序博客网 时间:2024/06/18 07:57

     题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方

    代码:

class Solution {public:    bool g_InvalidInput = false; // 采用全局变量来标识是否出错        bool equal(double num1,double num2)  //    {        if(fabs(num1 - num2) < 0.000001)            return true;        else             return false;    }        int PowerResult(double base, unsigned int exponent)    {        double result = 1.0;        for(int i = 0;i<exponent;++i)        {            result *= base;        }        return result;    }            double Power(double base, int exponent) {    g_InvalidInput = false;        if(equal(base,0.0) && exponent < 0)        {            g_InvalidInput = true;            return 0.0;        }        unsigned int absExponent = (unsigned int)exponent;        if(exponent < 0)            absExponent = (unsigned int)(-exponent);        //int result = PowerResult(base,absExponent);        double result = PowerResult(base,absExponent);        if(exponent < 0)            result = 1.0/result;        return result;    }};

    分析:

    (1)、如果不考虑全面,很容易几句话就搞定,即一个 for () 循环即可。但是,没有考虑如果输入的是零和负数怎么办?

    (2)、当底数(base)为0,且指数为负数的时候,如果不做特殊处理,就会出现对 0 求倒数而导致程序错误。告诉程序的调用者出现了错误有三种方法:返回值、全局代码和异常。本程序中,设置了一个全局变量 g_InvalidInput ,如果出错,这个返回值会被设置为 true 

    (3)、判断底数 base 是不是等于 0 的时候,不能直接写 base == 0,因为计算机在表示小数时,包括 float 和 double 类型,都有误差,不能直接用等于号判断。判断两个小数是否相等,只需要判断它们之间的差的绝对值是否在一个很小的范围内即可。

    (4)、还有一个更好的处理方法,能使程序的效率更高。见 P93页