实现mypow(x,n),即求x的整数次幂

算法思想:

这题我们不难想到可以使用二分法来求解,现在通过一个例子来辅助理解:

求pow(3,19):

19=(9*2+1)

可以得到:pow(3,19)=(pow(3,9)^2)*pow(3,1)

同理可得

pow(3,9)=(pow(3,4)^2)*pow(3,1)

pow(3,4)=pow(3,2)^2

pow(3,2)=3*3

像这样递归下去直至归化到幂为1,2时即可

当n为负数时同样可以采取这一思路,在此之前我们需要了解一下负数求余的特性:

请看下面一段代码:

int main()
{
    cout << "5%3=" << 5 % 3 << endl;
    cout << "5%-3=" << 5 % -3 << endl;
    cout << "-5%3=" << -5 % 3 << endl;
    cout << "-5%-3=" << -5 % -3 << endl;
    return 0;
}

 运行结果:

 可见余数的符号取决于分子

即a%b=sign(a)*(|a|%|b|)

我们同样举个栗子加以说明:

求pow(3,-19)

由-19=-9*2+(-1)

得pow(3,-19)=(pow(3,-9)^2)*pow(3,-1)

pow(3,-9)=(pow(3,-4)^2)*pow(3,-1)

pow(3,-4)=pow(3,-2)^2

pow(3,-2)=pow(3,-1)^2

像这样递归下去直至归化到幂为-1时即可

归纳总结:

对任意一个绝对值大于2的数n都可以写成n=2*(n/2)+n%2的形式,因此当n在上述情况时可以统一用以下公式表述:
pow(x,n)=pow(pow(x,n/2),2)*pow(x,n%2)
为此,只需要讨论n=0,1,-1,2四种情况即可,其他情况都可以通过上述递归公式回归到这四种情形。

代码:

double myPow(double x, int n)
{
	//0的任何非零次幂都等于0,假定0^0=0
	if (x == 0)
		return 0;
	if (n == 0)
		return 1;
	else if (n == 1)
		return x;
	else if (n == -1)
		return (1.0 / x);
	else if (n == 2)
		return x * x;
	else
		return myPow(myPow(x, n / 2), 2) * myPow(x, n % 2);//递归计算

}

对于0^0的处理有的计算器设定为1,我假定为0,但一般对其并不作定义,所以对此不必太过纠结。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值