面试题------数值整数次方

问题要求

实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要靠考虑大数问题。

问题分析

看到这个问题,我觉得我跟大多数人想的是一样,直接循环作乘法。但是仔细一想,考虑的还是太少了。从底数和指数两方面分别考虑:


有这么几种情况我们不容忽视,1)对0求倒数出现异常,要做特殊处理;2)0的0次方是没有任何意义的,需要做特殊处理;3)复次幂即将指数求绝对值,然后再将最后的结果取倒数即可。

仔细阅读题目就会发现,题目要求底数类型是double型的,那么在判断底数是不是等于0时,不能直接判断base == 0.(计算机在表示小数时都有误差)。判断两个小数是否相等,只能判断它们之差的绝对值是不是在一个很小的范围中。所以将该判断方法封装成一个函数即可  bool equal(double x,double y);

代码如下:

//全局变量用来标识出错是因为底数为0且指数为负数的情况
bool InvaildeInput = false;

//判断两个小数是否相等
bool equal(double x,double y)
{
	if ((x - y > -0.0000001) && (x - y < 0.0000001))
		return true;
	else
		return false;
}

//计算指数为正整数时的整数次方
double PowerUnsignedExponent(double base,unsigned int exponent)
{
	double result = 1.0;
	for(unsigned int i = 1; i <= exponent; i++)
	{
		result *= base;
	}

	return result;
}

double Power(double base,int exponent)
{
	InvaildeInput = false;

	if (equal(base,0.0) && exponent < 0)
	{
		InvaildeInput = true;
		return 0.0;
	}

	unsigned int UnsignedExponent = (unsigned int)exponent;
	if (exponent < 0)
	{
		UnsignedExponent = (unsigned int)(-exponent);
	}

	double result = PowerUnsignedExponent(base,UnsignedExponent);

	if (exponent < 0)
	{
		result = 1.0 / result;
	}

	return result;
}

问题总结

在此基础上,还有使用位运算来优化该算法的方法。这里并没有讨论,还是想说要多思考,多写。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值