剑指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页
代码:
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页
相关文章推荐
- 【剑指offer】3.3代码的完整性——面试题11:数值的整数次方
- 剑指offer-3-面试题11:数值的整数次方(对错误的处理)
- 剑指offer 面试题11 数值的整数次方
- 剑指Offer学习之面试题11 :数值的整数次方
- 【剑指Offer学习】【面试题11 :数值的整数次方】
- 剑指offer编程题Java实现——面试题11数值的整数次方
- 剑指offer面试题11 数值的整数次方 java实现
- 剑指Offer面试题11(Java版):数值的整数次方
- 剑指offer面试题11之求数值的整数次方
- 剑指offer_面试题11_数值的整数次方(*)
- 剑指Offer面试题11:数值的整数次方 Java实现
- 剑指offer面试题[11]-数值的正整数次方
- 剑指offer——面试题11:数值的整数次方
- 剑指Offer之面试题11:数值的整数次方
- 剑指Offer:面试题11 数值的整数次方
- 剑指Offer--面试题11 数值的整数次方
- 剑指Offer面试题11(Java版):数值的整数次方
- 【剑指offer】面试题11:数值的整数次方
- 剑指Offer面试题11(Java版):数值的整数次方
- 剑指offer面试题11 数值的整数次方