您的位置:首页 > 职场人生

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

2017-11-05 21:03 429 查看
     题目:给定一个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页
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: