16: 数值的整数次方

实现函数 pow(double base, int exponent)

常规的思路是,循环相乘,虽然简单,也有几个要注意的地方

  1. 0 的负数次方是错误的输入参数,因为负数次幂是借助除法算出,0 不能作为分母
  2. 非0数的负数次幂是,先求正数次幂,再取倒数。
  3. 0 的 0 次方是无意义的 (处理 or 不处理)

而循环相乘的部分可以优化,

a^n = a^(n/2) * a^(n/2) n为偶数

a^n =a^(n-1/2)* a^(n-1/2)*a n为奇数

这样,O(logN)下就可以求出结果

public static double pow(double base, int exponent) throws Exception {
	if (base == 0 && exponent <= 0) {
		throw new Exception("error");
	}
	if (exponent < 0) {
		return 1/power(base, -exponent);
	} else {
		return power(base, exponent);
	}
}

private static double power(double base, int exponent) {
	if (exponent == 0) {
		return 1;
	}  else if (exponent == 1) {
		return base;
	} else {
		double result = power(base, exponent/2);
		result *= result;
		if (exponent % 2 == 1) {
			result *= base;
		}
		return result;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值