您的位置:首页 > Web前端

offer题11 数值的整数次方&判断浮点型是否相等&降低求n次方的时间复杂度&3种错误处理方式

2016-04-13 00:34 721 查看
数值的整数次方(面试题11)
判断浮点型是否相等
降低求n次方的时间复杂度
3种错误处理方式

1.数值的整数次方(面试题11)
题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题

分析思路:

当base≠0时

exponent ≥0 可以直接Power
exponent <0 1.0/Power(-exponent)

当base=0时,

exponent ≥0 可以直接Power,但都是0;特别的:0的0次方无意义,本方法返回1.0
exponent <0 错误输入,有3种错误处理方式,要和面试官商量挑合适

最后就是考虑:判断浮点型是否相等
降低求n次方的时间复杂度

2.判断浮点型是否相等

判断浮点型是否相等要注意精度设置!跟整数不一样哦,很容易一时忽略的!
3.[b]降低求n次方的时间复杂度[/b]

求方函数有如下公式让效率更高



要优化就把细节都做好:用>>1代替÷2,用&0x1代替%2判断奇偶,这两个都是offer题10 位运算中提过的

4.三种错误处理方式

返回值:优点:是和系统API一致;缺点:不能方便的使用计算结果
全局变量:优点:能够方便的使用计算结果;缺点:用户可能会忘记检查全局变量
抛出异常:优点:可以为不同的错误定义不同的异常类型,逻辑清晰(try……catch……);缺点:有些语言不支持异常,抛出异常时对性能有负面影响
前面10题我都是用返回值和抛出异常,这道题试试我不太习惯用的全局变量

#include<iostream>
using namespace std;

bool g_InvalidInput = false;
bool DoubleEqualZero(double num1,double num2)
{
if((num1-num2)>-10e-8 &&
(num1-num2)<10e-8)
return true;
else
return false;
}
double PowerWithUnsignedExponent(double base,int exponent)
{
double result = 1.0;
for(int i=1;i<=exponent;++i)
result *= base;
return result;
}
double PowerWithUnsignedExponentFastly(double base,int exponent)
{
if(exponent == 0)
return 1.0;
if(exponent == 1)
return base;
//若exponent是奇数,减1再除以2和直接除以2结果一样,因为是整形
double result = PowerWithUnsignedExponentFastly(base,exponent>>1);
result *= result;
if(exponent & 0x1)
result *= base;
return result;
}
double Power(double base,int exponent)
{
g_InvalidInput = false;
if(DoubleEqualZero(base,0.0) && exponent<0)
{
g_InvalidInput = true;
return 0.0;
}
unsigned AbsExponent = (unsigned)exponent;
if(exponent < 0)
AbsExponent = (unsigned)(-exponent);
double result = PowerWithUnsignedExponentFastly(base,AbsExponent);
if(exponent < 0)
result = 1.0/result;
return result;
}
int main()
{
cout<<"0,0:"<<Power(0,0)<<endl;
cout<<"2,3:"<<Power(2,3)<<endl;
cout<<"2,-3:"<<Power(2,-3)<<endl;
cout<<"-2,-3:"<<Power(-2,-3)<<endl;
cout<<"-2,0:"<<Power(-2,0)<<endl;
if(g_InvalidInput)
cout<<"0,-2:"<<Power(0,-2)<<endl;
else cout<<"0,-2:"<<"Error input"<<endl;
return 0;
}


测试用例:底数和指数分别为正、负、0。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: