第一次尝试
public double expCal(double base, int exponent){
double res = 1;
for(int i =0; i< exponent; i++){
res *= base;
}
return res;
}
当然我们都知道,这种写法对芯片太不友好了,计算量巨大。但是,相比于不够好,更重要的是会出现错误。写程序很重要的一点是考虑边界问题。在这道题中,exponent的边界有0,负数,以及当exponent为负数时base不能为0.
public class Solution {
int n = exponent;
if(n == 0) return 1;
if(n < 0 && base == 0) throw new Exception(" Base cannot be negative! ");
if(n < 0){
if(base == 0) throw new Exception(" Base cannot be negative! ");
n= -exponent;
}
double res = expCal(base, exponent);
return n<0? 1/res: res;
public double expCal(double base, int exponent){
double res = 1;
for(int i =0; i< exponent; i++){
res *= base;
}
return res;
}}
接下来提高计算效率,减少计算量。
因为要乘以整数次的底数,所以可以考虑递归
若整数是偶数,则平方,若是奇数,则平方后再乘一次底数
public class solution{
public double pow(double base, int exponent){
if(exponent == 0) return 1;
if(exponent == 1) return base;
double res = pow(base, exponent/2);
res *= res;
if(exponent % 2 == 1)
res *= base;
}
return res;
}
其中,exponent % 2 ==1 的操作可以简化为 移位+与1运算
原文:https://www.cnblogs.com/cherry-BAIL/p/12953725.html