题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0。不得使用库函数,同时不需要考虑大数问题,也不用考虑小数点后面0的位数。
输入:2.00000,3
输出:8.00000
算法思路
暴力法
可以直接使用暴力法
如果 exponent>0,那么答案为:baseexponent
如果 exponent<0,先取exponent的绝对值,求出 baseexponent,然后将结果取倒数,即 1 / baseexponent。 或者可以先取exponent的绝对值,直接求出 (1/base)exponent。 两者都一样
二分法
上述暴力法的时间复杂度为O(n),比O(n)更好的是O(logn)。所谓的二分就是求其中一半,比如 2100 = 250 * 250,即求出把求2100变成了求250,250也可以继续分解下去,250 = 225 * 225,以此类推……
exponent可以分奇数和偶数讨论
- 当 exponent 为偶数时(这里的n就是exponent):
xn = (x2)n/2 - 当 exponent 为奇数时:
xn = x * (x2)n/2,即多出一项x 比如:27 = 2 * (22)7/2(不要忘了哦,7/2=3)
代码实现
暴力法
public class Solution {
public double Power(double base, int exponent) {
if(base==0) return 0;
int e = exponent >0 ? exponent : -exponent;
double res = 1.0d;
for(int i=0;i<e;i++){
res *= base;
}
return exponent > 0 ? res : 1/res;
}
}
时间复杂度:O(n)
二分法(递归实现)
public class Solution {
public double Power(double base, int exponent) {
if(base == 0) return 0;
if(exponent < 0){
base = 1/base;
exponent = exponent;
}
return q_power(base,exponent);
}
private double q_power(double b,int n){
if(n==0) return 1.0;
double res = q_power(b,n/2);
if(n%2==0){
return res * res;
}else{
return res * res * b;
}
}
}
时间复杂度:O(logn)
|