数值的整数次方

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

/*
* 考虑不够全面的解法,没有考虑到输入的指数小于0的情况
*/

double Power(double base, int exponent)
{
	double result = 1.0;
	for (int i = 1; i < exponent; ++i)
	{
		result *= base;
	}

	return result;
}

/*
* 考虑较全面的解法
*/
#include<cmath>

//比较两个double类型是否相等
bool equal(double num1, double num2)
{
	if (abs(num1 - num2) < 0.000001)
	{
		return true;
	}

	return false;
}

double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
	double result = 1.0;
	for (int i = 1; i <= exponent; ++i)
	{
		result *= base;
	}
	return result;
}

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 = abs(exponent);

	double result = PowerWithUnsignedExponent(base, absExponent);
	if (exponent < 0)
	{
		result = 1.0 / result;
	}

	return result;
}


/*
* 高效的解法,用于优化上面PowerWithUnsignedExponent函数。
* 如果exponent为32,那么就需要做31次乘法。换一种思路,如果求一个数字的32次方,
* 我们知道了这个数的16次方,那么只需要他的16次方再平方就可以了,依次递归。
*/

double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
	if (exponent == 0)
		return 1;
	if (exponent == 1)
		return base;

	double result = PowerWithUnsignedExponent(base, exponent >> 1);
	result *= result;

	if (exponent & 0x1 == 1)
	{
		result *= base;
	}

	return result;
}

  

posted on 2021-11-24 08:31  xcxfury001  阅读(45)  评论(0)    收藏  举报

导航