版权声明:转载请点赞,当然附上原文链接也很不错 https://blog.csdn.net/m0_37961948/article/details/88379310
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
主要是考虑情况,幂 == 0, k>0, k<0.
最暴力的办法:
private double myPower(double base, int exponent) {
if (base == 0) {
return 0;
}
if (exponent == 0) {
return 1;
} else if (exponent < 0) {
double res = base;
while (exponent++ != -1) {
res *= base;
}
return 1 / res;
} else {
double res = base;
while (exponent-- != 1) {
res *= base;
}
return res;
}
}
这个时间复杂度是O(n).并不被推荐。
我们来推导一下公式即可。
如果幂 n 是偶数,那么,
a^n = {1. a^(n/2) * a^(n/2)
幂n是奇数,那么
a^((n-1)/2) * a^((n-1)/2) * a
这样就实现了O(log n)的时间复杂度
public double Power(double base, int exponent) {
// 负数情况下的补充
int n=Math.abs(exponent);
// 作者推荐算法
if (n == 0) {
return 1;
} else if (n == 1) {
return base;
}
//a^n = {1. a^(n/2) * a^(n/2) . (n为偶数)
// {2. a^((n-1)/2) * a^((n-1)/2) * a (n为奇数)
double result = Power(base, n >> 1);
result *= result;
if ((n & 1) == 1) {
result *= base;
}
// 负数情况下的补充
if(exponent < 0){
result = 1 / result;
}
return result;
}
扫描二维码关注公众号,回复:
5489922 查看本文章