数值整数次方

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


#include<iostream>

bool equal(double num1, double num2);
double powerWithUnsignedExponent(double base, unsigned int absExponent);
double Power(double base, int exponent)
{
	if(equal(base,0) && exponent <=0)	//考虑无效输入
		throw new std::exception("Invalid input!");

	unsigned int absExponent = exponent;
	if(exponent < 0)					//考虑指数为负数的情况
		absExponent = unsigned int(-exponent);
	
	double result = powerWithUnsignedExponent(base,absExponent);
	
	if(exponent<0)						//得到指数为负数的结果
		return 1.0/result;

	return result;
}
/*时间复杂度为O(N)
double powerWithUnsignedExponent(double base, unsigned int absExponent)
{
	double result = 1.0;
	for(int i=1; i<=absExponent; i++)	//实现base^absExponent
		result *= base;
	return result;
}
*/
//判断两个double是否相等
bool equal(double num1, double num2)	
{
	if((num1-num2>0.0000001)
		&& (num1-num2<0.0000001))
		return true;
	else
		return false;
}


//上面注释的powerWithUnsignedExponent()方法虽然能满足功能,
//但是不够高效时间复杂度为O(n)
//以下方法利用
//a^n = a^(n/2) * a^(n/2);当n为偶数
//a^n = a^((n-1)/2) * a^((n-1)/2) * a;当n为奇数
//其时间复杂度为O(NlogN)
double powerWithUnsignedExponent(double base, unsigned int absExponent)
{
	if(absExponent == 0)
		return 0;
	if(absExponent == 1)
		return base;
	double result = powerWithUnsignedExponent(base,absExponent >> 1);//右移代替除以2
	result *= result;
	if(absExponent & 0X01 == 1)		//判断absExponent是不是奇数
		result *= base;
	return result;
}

int main()
{
	double result1 = Power(2,4);	//基数和指数都为正式
	double result2 = Power(2,0);	//指数为0
	double result3 = Power(-2,1);	//指数为1
	double result4 = Power(-3,-2);	//指数为负数

	std::cout << result1 <<std::endl;//结果输出
	std::cout << result2 <<std::endl;
	std::cout << result3 <<std::endl;
	std::cout << result4 <<std::endl;
	return 0;	
}
//由于计算机表示的小数(float和double)都有误差,我们不能直接用等号(==)
//判断两个小数是否相等。如果两个小数的差的绝对值很小,比如小于0,.0000001
//就可以认为他们相等。
//用位运算替换乘除法,效率高很多

==参考剑指offer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值