实现函数 double Power(double base, int exponent),求base的exponent次方。
注意:
1.保证base和exponent不同时为0。
2.不得使用库函数,同时不需要考虑大数问题
3.有特殊判题,不用考虑小数点后面0的位数。
数据范围:
,
,保证最终结果一定满足 
进阶:空间复杂度
,时间复杂度 %5C)
进阶:空间复杂度
2.00000,3
8.00000
2.10000,3
9.26100
2.00000,-2
0.25000
2的-2次方等于1/4=0.25
public static double Power(double base, int exponent) {
//3个递归边界条件
if (exponent == 0) {
return 1;//如果次方是0,返回1, 0的0次方也是1
}
if (exponent == 1) {
return base;//如果次方是1,返回base
}
//这里要特别注意,对于次方为负数,exponent / 2的结果为 -1
if (exponent == -1) {
return 1 / base;
}
//递归
if (exponent % 2 == 0) {
//如果次方是偶数,比如2的4次方,直接算2的2次方 再算2的2次方乘2的2次方
double power = Power(base, exponent / 2);
return power * power;
} else {
//如果次方是奇数,比如2的5次方,先算2的3次方,再算2的2次方,最后乘起来
double power1 = Power(base, exponent / 2);
double power2 = Power(base, exponent - exponent / 2 );
return power1 * power2;
}
}
这段代码的时间复杂度是多少?有点人说O(logN),有的说O(n),有大佬帮分析一下吗? import java.util.*;
public class Solution {
public double Power1(double base, int exponent) {
double num = base;
if (exponent > 0) {
for (int i = 0; i < exponent - 1; i++) {
base *= num;
}
} else if (exponent == 0) {
base = 1l;
} else {
for (int i = 0; i > exponent - 1; i--) {
base *= 1l / num;
}
}
return base;
}
public double Power(double base, int exponent) {
if (exponent == 0) {
return 1l;
}
if (exponent == 1) {
return base;
}
if (exponent == -1) {
return 1 / base;
}
if (exponent % 2 == 0) {
double power = Power(base, exponent / 2);
return power * power;
} else {
double power1 = Power(base, exponent / 2);
int addNum = 1;
if (exponent < 0) {
addNum = -1;
}
double power2 = Power(base, exponent / 2 + addNum);
return power1 * power2;
}
}
}
import java.util.*;
public class Solution {
public double Power(double base, int exponent) {
if(exponent == 0){
return (double)1;
}else if(exponent > 0){
return Math.pow(base,exponent);
}else{
base = 1.0 / base;
exponent = -exponent;
return base * Power(base,exponent - 1);
}
}
} import java.util.*;
public class Solution {
public double Power(double base, int exponent) {
if(exponent==0){
return 1.0;
}
if(base==0){
return 0;
}
int log=exponent;
exponent=Math.abs(exponent);
double result=1;
while(exponent>0){
if(exponent%2==1){
result*=base;
}
if(exponent%2==1){
exponent=(exponent-1)/2;
}else{
exponent/=2;
}
base*=base;
}
if(log<0){
return 1/result;
}
return result;
}
} public class Solution {
public double Power(double base, int exponent) {
if(exponent==0)return (double)1;
else if(exponent>0)return base * Power(base, exponent-1);
else {
base = 1/base;
exponent = -exponent;
return base * Power(base, exponent-1);
}
}
} public class Solution {
public double Power(double base, int exponent) {
if (exponent == 0)
return 1.0;
double res = 1.0;
if (exponent < 0) {
res = 1 / res;
base = 1 / base;
exponent = -exponent;
}
double b = base;
//把指数转化为二进制
while (exponent > 0) {
//看其二进制哪位上有1
if ((exponent & 1) != 0)
res *= b;
//看当前遍历到2的几次方了
b *= b;
//算过了就淘汰掉
exponent >>= 1;
}
return res;
}
} 不能使用库函数的话。
使用循环计算指数幂,设置一个flag表示幂的正负。幂正返回结果,幂负返回结果的倒数。
public class Solution {
public double Power(double base, int exponent) {
if(base==(double)0)return 0;
double res=1;
int flag=0;
if(exponent<0){
flag =1;
exponent = -exponent;
}
for(int i=0;i<exponent;++i){
res = base*res;
}
if(flag==0)
return res;
else return 1/res;
}
}
public class Solution {
public double Power(double base, int exponent) {
if(base-0.0<0.000001 && base-0.0>-0.000001){
return 0;
}
double ans = 1;
if(exponent<0) {
base = 1/base;
exponent = -1*exponent;
}
while (exponent > 0) {
ans = ans * base;
exponent--;
}
return ans;
}
} public class Solution {
public double Power(double base, int exponent) {
if(exponent==0)
return 1;
if(exponent<0){
base = 1/base;
exponent = -1*exponent;
}
double temp = base;
for(int i = 1;i<exponent;i++){
base = base*temp;
}
return base;
}
}
/** * 1.全面考察指数的正负、底数是否为零等情况。 * 2.写出指数的二进制表达,例如13表达为二进制1101。 * 3.举例:10^1101 = 10^0001*10^0100*10^1000。 * 4.通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。 */ public double Power(double base, int n) { double res = 1,curr = base; int exponent; if(n>0){ exponent = n; }else if(n<0){ if(base==0) throw new RuntimeException("分母不能为0"); exponent = -n; }else{// n==0 return 1;// 0的0次方 } while(exponent!=0){ if((exponent&1)==1) res*=curr; curr*=curr;// 翻倍 exponent>>=1;// 右移一位 } return n>=0?res:(1/res); }