JZ12 数值的整数次方
原题链接
描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0。不得使用库函数,同时不需要考虑大数问题,也不用考虑小数点后面0的位数。
示例
输入:2.00000,-2
返回值:0.25000
说明:2的-2次方等于1/4=0.25
思路
最初始的想法自然是 for 循环了,不过要注意指数为 0,底是 0 指数是负数的这些特殊情况。然后就有了改进方法:26 等于 23 * 23,27 等于 23 * 23 * 2 也就是基数。这样时间复杂度就变成了O(log2n)。
解答
public class Solution {
public double Power(double base, int exponent) {
if (base == 0 && exponent <= 0) return 0;
double res = 1.0;
if (exponent < 0) {
base = 1 / base;
exponent=-exponent;
}
for (int i = 0; i < exponent; i++) {
res = res * base;
}
return res;
}
}
优化
public class Solution {
public double Power(double base, int exponent) {
if (base == 0 && exponent <= 0) return 0;
if (exponent == 0) return 1;
if (exponent < 0) {
base = 1 / base;
exponent = -exponent;
}
double res = MyPower(base, exponent);
return res;
}
public double MyPower(double base, int exponent) {
if (exponent == 1) return base;
double res = MyPower(base, exponent >> 1);
res *= res;
System.out.println(res);
if ((exponent & 1) == 1)
res *= base;
return res;
}
}
更
更好理解的递归版本
class Solution {
public double myPow(double x, int n) {
if (x == 0) return 0;
long b = n;
return recur(x, n);
}
public double recur(double x, long n) {
if (n == 0) return 1;
if (n < 0)
return recur(1 / x, -n);
else if ((n & 1) == 0)
return recur(x*x, n / 2);
else
return x * recur(x, n - 1);
}
}
本文来自博客园,作者:klaus08,转载请注明原文链接:https://www.cnblogs.com/klaus08/p/15159344.html