实现函数 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; } }