12.剑指offer-数值的整数次方*

时间:2022-11-22 07:24:46


题干

给定一个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;
}

}
}

大佬解析

提了个叫快速幂的东西,但是,执行时间来看,跟我的纯数学解析没啥区别。

12.剑指offer-数值的整数次方*

// 递推写法
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;
}
}