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

  1. 数值的整数次方(面试题11)
  2. 判断浮点型是否相等
  3. 降低求n次方的时间复杂度
  4. 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.低求n次方的时间复杂度
  • 求方函数有如下公式让效率更高
  • 要优化就把细节都做好:用>>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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值