题干
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0。
关键词:数学
我的思路
分情况讨论:base和exponent的为0情况。然后用土办法,相乘作为次方。
注意考虑进去指数位置的正负。
我的代码
public class Solution {
public double Power(double base, int exponent) {
//先分情况讨论
if(base==0&&exponent!=0){
return 0;
}else if(base!=0&&exponent==0){
return 1;
}else{
double result = base;
//讨论正负
for(int i =2;i<=(exponent>0?exponent:-1*exponent);i++){
result*=base;
}
return exponent>0?result:1/result;
}
}
}
大佬解析
提了个叫快速幂的东西,但是,执行时间来看,跟我的纯数学解析没啥区别。
// 递推写法
public class Solution {
public static double Power(double base, int exp) {
boolean flag = false;
if (exp < 0) {
flag = true;
exp = -exp;
}
double ans = 1;
while (exp > 0) {
if ((exp & 1) == 1) {
ans = ans * base;
}
exp >>= 1;
base *= base;
}
return flag ? 1 / ans : ans;
}
}
我竟然没写过递归的快速幂算法,成功get到新技能~
// 递归写法
public class Solution {
public static double Power(double base, int exp) {
boolean flag = exp < 0;
if (flag) {
exp = -exp;
}
double result = getPower(base, exp);
return flag ? 1 / result : result;
}
public static double getPower(double base, int exp) {
if (exp == 0) {
return 1;
}
if (exp == 1) {
return base;
}
double ans = getPower(base, exp >> 1);
ans *= ans;
if ((exp & 1) == 1) {
ans *= base;
}
return ans;
}
}