数值的整数次方

数值的整数次方。

在解题的过程中,需要先想清楚解题思路,然后再解题。
在这里,用到了高中学习到的分类讨论的思想:
      
 首先,需要判断 输入参数的范围
  • base,分情况讨论:0和非0
  • exponent正数和负数,所进行的计算方法不一样.
  • exponent为负数时,结果为绝对值的倒数!
  • 优化的地方:计算幂函数值,可以使用递归来计算。
基本思路:
  1. 输入base和exponent.
  2. 第一步,判断base是否为0,若是,则需要保证exponent>=0;
  3. 第二步,判断exponent是否为正数,若是,则结果为 base的exponent次方。若是负数,则结果为倒数!
  4. 计算  base^abs(exponent)次方。
  5. 根据exponent的正负,返回对应的结果。
我写的代码如下:

publicclassSolution {
    public double Power(double base, int exponent) {
        if(base == 0.0 && exponent <=0){
            return 0.0;
        }
        if(exponent == 0){
            return 1;
        }
        double result = 0;
        boolean positive = exponent < 0?false:true;
        double absResult = PowerCore(base,exponent);
         
        if(positive)
            result = absResult;
        else
            result = 1.0/absResult;
        return result;
}
         
    // 此处,使用递归来求解
    /*
    a^n = a^(n/2)*a^(n/2),n为偶数时;
    a^n = a^(n/2)*a^(n/2)*a;
    */
    publicdoublePowerCore(doublebase, intexponent) {
        if(exponent == 0){
            return1;
        }
        if(exponent == 1){
            returnbase;
        }
        // 判断是奇数还是偶数
        // n & 1的效果,等效于 n%2
        if((exponent&0x1) == 1){
            returnbase*PowerCore(base,exponent/2)* PowerCore(base,exponent/2);
        }else{
            returnPowerCore(base,exponent/2)* PowerCore(base,exponent/2);
        }
    }
}

较为简洁的代码如下:
 public class Solution {
    public double Power(double base, int exponent) { 
        if(exponent==0 && base != 0)
            return 1;
        if(exponent==1)
            return base;
        if(base == 0 && exponent <= 0){
            throw new RuntimeException();
        }
        if(base ==0 && exponent>0){ 
            return 0;
        }
        int n= exponent;
        if(exponent<0){
            n = -exponent;
        }
        double  result=Power(base,n>>1);// 此处,使用位运算,来进行取半,值得学习
        result*=result;
        if((n&1)==1)
            result*=base; 
        if(exponent<0)
            result=1/result;
        return result;     
  }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-11 11:24
大家还是用ai改吧,我心疼得要死,就当花钱买教训吧,人家直接拿完钱就跑路了
程序员小白条:简历修改700....神奇,又不是帮你面试,咋的,简历修改从双非变92了还是没实习变成有大厂实习了
点赞 评论 收藏
分享
06-15 02:05
已编辑
南昌航空大学 数据分析师
Eason三木:你如果想干技术岗,那几个发公众号合唱比赛的经历就去掉,优秀团员去掉,求职没用。然后CET4这种不是奖项,是技能,放到下面的专业技能里或者单独列一个英语能力。 另外好好改改你的排版,首行缩进完全没有必要,行间距好好调调,别让字和标题背景黏在一起,你下面说能做高质量PPT你得展现出来啊,你这简历排版我用PPT做的都能比你做的好。 然后自我评价,你如果要干数据工程师,抗压能力强最起码得有吧。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务