面试算法(十)数值的整数次方

1、题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,不考虑大数问题。

解法:当指数为负数的时候,可以先对指数求绝对值,然后算出次方的结果之后再取倒数。当底数是0且指数是负数的时候,如果不做特殊处理,就会出现对0求倒数从而导致程序运行出错。

怎么告诉函数的调用者出现了这种错误?

三种方法:返回值。全局代码。异常。

bool g_InvalidInput = false;

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);
	double result = PowerWithUnsignedExponent(base, absExponent);
	if(exponent <0)
		result = 1.0 / result;
	return result;
}

double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
	double result = 1.0;
	for(int i=1; i<=exponent; ++i)
		result *= base;
	return result;
}
bool equal(double num1, double num2)
{
	if((num1 - num2 > -0.0000001) && (num1 - num2 < -0.0000001))
		return true;
	else
		return false;
}


我们采用全局变量来表示是否出错。若出错则返回0。为了区分是出错返回的0还是底数为0的时候正常运行返回的0,还定义了一个全局变量g_InvalidInput。当出错时,此变量被设为true,否则为false。

这样的好处是,可以把返回值直接传递给其他变量,比如写double result = Power(2,3),也可以把函数的返回值直接传递给其他需要double型参数的函数。但缺点是这个函数的调用者有可能会忘记去检查g_InvalidInput以判断是否出错,留下了安全隐患。

注意:判断两个小数是否相等,只能判断他们之差的绝对值是不是在一个很小的范围内。如果两个数相差很小,就可以认为他们相等。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值