第三章 高质量的代码 数值的整数次方

     实现函数double Power(double base, int exponent),求base 的exponent次方,不得用库函数(C语言有一个pow函数),同时需要考虑大数问题.

    高效率的解决方案如下:

#include "stdafx.h"
#include <math.h>

bool g_InvalidInput = false;  //全局变量标识是否出错
bool equal(double num1, double num2);  //判断两个double数是否相等
double PowerWithUnsignedExponent(double base, unsigned int exponent); //求基数的指数次方

//求基数的指数次方
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;
}
*/

//递归高效率实现指数运算
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
	if (exponent == 0)
		return 1;
	if (exponent == 1)
		return base;

	double result = PowerWithUnsignedExponent(base, exponent >> 1); //除以2用移位操作优化细节
	result *= result;
	if ((exponent & 0x1) == 1)
		result *= base;

	return result;
}
//判断相等的函数
bool equal(double num1, double num2)
{
	if ((num1 - num2 > -0.0000001)
		&& (num1 - num2 < 0.0000001))
		return true;
	else
		return false;
}

// ====================测试代码====================
void Test(double base, int exponent, double expectedResult, bool expectedFlag)
{
	double result = Power(base, exponent);
	if (abs(result - expectedResult) < 0.00000001
		&& g_InvalidInput == expectedFlag)
		printf("Test passed.\n");
	else
		printf("Test failed.\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
	// 底数、指数都为正数
	printf("Test1 begins.\n");
	Test(2, 3, 8, false);

	// 底数为负数、指数为正数
	printf("Test2 begins.\n");
	Test(-2, 3, -8, false);

	// 指数为负数
	printf("Test3 begins.\n");
	Test(2, -3, 0.125, false);

	// 指数为0
	printf("Test4 begins.\n");
	Test(2, 0, 1, false);

	// 底数、指数都为0
	printf("Test5 begins.\n");
	Test(0, 0, 1, false);

	// 底数为0、指数为正数
	printf("Test6 begins.\n");
	Test(0, 4, 0, false);

	// 底数为0、指数为负数
	printf("Test7 begins.\n");
	Test(0, -4, 0, true);

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值