題目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
自己做的时间复杂度为O(n)
public class Solution {
public double Power(double base, int exponent) {
Double temp = base;
if (exponent > 0 && base != 0) {
for (int i = 1; i < exponent; i++) {
base *= temp;
}
}
if (exponent == 0 && base != 0) {
return 1;
}
if (exponent < 0 & base != 0) {
exponent= 0-exponent;
for (int i = 1; i < exponent; i++) {
base *= temp;
}
//System.out.println(base);
base =( 1 / base);
return base;
}
return base;
}
}
在讨论上看见大佬采用快速幂 直接将复杂度降低到 O(logn) 实在是厉害
代码:
class Solution12 {
public static double Power(double base, int exponent) {
Double end = 1.0;
int n = 0;
if (exponent > 0 & base != 0) {
n=exponent;
}
if (exponent == 0 && base != 0) {
return 1;
}
if(base == 0&&exponent != 0) {
return 0;
}
if (exponent < 0 & base != 0) {
n= 0-exponent;
}
while(n!=0) {
if((n&1)==1) {
end *= base;
}
base *=base;
n>>=1;
}
return exponent>0?end:(1/end);
}
}
原理核心就是这张图了把
即前面系数乘以2的幂,当二进制的某一位为0时,表示这一位2的相应次幂系数为零,参考上面代码,只有不为零时,才用end相乘,特别注意base * base,第一次 平方(2),第二次2*2 是4次方(4),后面以此类推;
用于求具体2^n相当的快!!!