数值的整数次方

数值的整数次方。

在解题的过程中,需要先想清楚解题思路,然后再解题。
在这里,用到了高中学习到的分类讨论的思想:
      
 首先,需要判断 输入参数的范围
  • 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-08 11:16
点赞 评论 收藏
分享
05-27 14:57
西北大学 golang
强大的社畜在走神:27届真不用急,可以搞点项目、竞赛再沉淀沉淀,我大二的时候还在天天打游戏呢
投递华为等公司10个岗位
点赞 评论 收藏
分享
06-20 17:42
东华大学 Java
凉风落木楚山秋:要是在2015,你这简历还可以月入十万,可惜现在是2025,已经跟不上版本了
我的简历长这样
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 12:31
以前小时候我最痛恨出轨、偷情的人,无论男女,为什么会出轨?现在我成了自己最讨厌的人,没想到分享的东西在牛客会被这么多人看,大家的评价都很中肯,我也认同,想过一一回复,但我还是收声了,我想我应该说说这件事,这件事一直压在我心里,是个很大的心结,上面说了人为什么出轨,我大概能明白了。我们大一下半年开始恋爱,开始恋爱,我给出了我铭记3年的承诺,我对她好一辈子,我永远不会背叛,我责任心太重,我觉得跟了我,我就要照顾她一辈子,我们在一起3年我都没有碰过她,她说往东我就往东,她说什么我做什么,她要我干什么,我就干什么!在学校很美好,中途也出过一些小插曲,比如男闺蜜、男闺蜜2号等等等。但我都强迫她改掉了,我...
牛客刘北:两个缺爱的人是没有办法好好在一起的,但世界上哪有什么是非对错?你后悔你们在一起了,但是刚刚在一起的美好也是真的呀,因为其他人的出现,你开始想要了最开始的自己,你的确对不起自己,21岁的你望高物远,你完全可以不谈恋爱,去过你想要的生活,你向往自由,在一起之后,你要想的不是一个人,而是两个人,你不是变心了,就像你说的,你受够了,你不想包容了,冷静几天是你最优的选择,爱人先爱己。
社会教会你的第一课
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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