数值的整数次方--简约而不简单

1、题目:

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


2、考虑最简单的解法

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

缺点:没有考虑输入的指数exponent小于1即是零和负数的情况。


3、全面但不够高效的解法

//判断两个浮点数是否相同
bool equal(double d1, double d2)
{
	if((d1-d2<0.00000001)&&(d1-d2>-0.00000001))
		return true;
	else
		return false;
}

//求无符号整数的次方
double PowerWithUnisgnedInt(double base, unsigned int exponent)
{
	double result=1.0;
	for(int i=1;i<exponentl i++)
	{
		result*=base;
	}
	return result;
}

double Power(double base, int exponent)
{
	double result=1.0;
	//对base为0,指数是负数的情况
	if(equal(base,0.0)&&exponent<0)
	{
		cout<<"error!"<<endl;
		return 0.0;
	}
	unsigned int absExponent=(unsigned int)exponent;
	if(exponent<0)
		absExponent=(unsigned int)(-exponent);
	result=PowerWithunsignedInt(base,absExponent);
	if(exponent<0)
		return 1.0/result;
	return result;
}

3、追求效率的解法

    针对n次方,我们可以考虑用如下的公式来求:


可以通过优化double PowerWithUnisgnedInt(double base, unsigned int exponent)达到对效率的进一步优化。

double PowerWithUnisgnedInt(double base, unsigned int exponent)
{
	double result=1.0;
	if(exponent == 0)
		return 1;
	if(exponent == 1)
		return base;
	result=PowerWithUnsignedInt(base,exponent>>1);
	result*=result;
	if(exponent&OX1 ==1)
		result*=base;
	return result;
}

在优化方法中,我们使用了右移运算符代替了除以2,用位运算符代替了求余运算符来判断一个数是奇数还是偶数。因为位运算效率比乘数法及求余运算的效率高很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值