数值的整数次方

题目:实现函数double power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
解析:我们可以很快就写出一下的代码。不过遗憾的是,写得快不一定就对,如果输入的指数(exponent)小于1即是零和负数的时候怎么办。下面代码只考虑指数为正数的情况。
double power(double base,int exponent)
{
	double res = 1.0;
	for(int i = 1; i <= exponent; ++i)
	{
		res *= base;
	}
	return res;
}
方法一:当我们知道指数为负数的时候,可以先对指数求绝对值,然后算出结果后再取倒数。取倒数的情况,我们需要特殊考虑对0取倒数。最后,由于0的0次方在数学上是没有意义的,因此输出0还是1都是可以接受的。
//判断两个double类型的数值是否相等
bool equal(double num1,double num2)
{
	if((num1 - num2) < 0.0000001
		&& (num1 - num2) > -0.0000001)
	{
		return true;
	}
	return false;
}

//对指数为正数的情况求值
double powerWithUnsigned(double base,unsigned int exponend)
{
	double res = 1.0;
	for(unsigned int i = 1; i <= exponend; ++i)
	{
		res *= base;
	}
	return res;
}

//全面考虑的情况
double power(double base,int exponend)
{
	//对0求倒数情况,我们抛出异常
	if(equal(base,0.0) && exponend < 0)
	{
		throw new exception("参数异常");
		return 0.0;
	}
	unsigned int absExponend = (unsigned int)exponend;
	if(exponend < 0)
	{
		absExponend = (unsigned int)(-exponend);
	}

	if(exponend < 0)
		return 1.0 / powerWithUnsigned(base,absExponend);
	return powerWithUnsigned(base,absExponend);
}
方法二:全面高效的解法,如果输入的指数exponent为32,我们在powerWithUnsigned的循环中需要做31次乘法,但我们可以换一种思路考虑,我们的目标是求出一个数的32次方,我们可以先求出它的16次方,只需要在16次方的基础上再次平方一次就可以了。所以我们用递归的方式改写powerWithUnsigned函数。
double powerWithUnsigned01(double base,unsigned int exponend)
{
	if(exponend == 0)
		return 1.0;
	if(exponend == 1)
		return base;
	double res = powerWithUnsigned01(base,exponend>>1);
	res *= res;
	if(exponend & 1)
	{
		res *= base;
	}
	return res;
}


你可能感兴趣的:(数值的整数次方)