数值的整数次方

数值的整数次方

https://www.nowcoder.com/practice/1a834e5e3e1a4b7ba251417554e07c00?tpId=13&&tqId=11165&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

一、使用递归的快速幂

求base的exponent次方,可分为以下两种
图片说明
我们可以使用递归进行求解此问题
但是还有一个问题就是,当n为负数的时候,那么求得的最终结果必定是当n为正数时求的结果的倒数,
所以我们还需要有一个标记,标记n是正数还是负数。

public double Power(double base, int exponent) {
        if(exponent == 0)
            return 1;
        if(exponent == 1)
            return base;  /*两个特判*/
        boolean isNegative = false;  /*用来标记exponent是否为负数*/
        if(exponent < 0){
            exponent = -exponent;   /*这里将exponent重新变为正数*/
            isNegative = true;      /*标志为负数*/
        }
        double pow = Power(base*base, exponent/2);   /*递归求解*/
        if(exponent % 2 != 0){          /*如果exponent为奇数,则还需要乘多一边base*/
            pow *= base;
        }
        return isNegative ? 1/pow:pow;   /*判断exponent为正数还是负数*/
  }

二、非递归的快速幂

已知6可以表示成二进制110
图片说明
图片说明
所以将指数跟1进行与运算,如果不为0,则表示当前位需要乘进结果中,具体看代码就能够明白

public double Power(double base, int exponent) {
        // exponent为负数则先将底数取倒数,然后按指数为正数的去计算
        if(exponent < 0){
            base = 1/base;
            exponent = -exponent;
        }
        double res = 1.0;   /*作为返回结果*/
        while(exponent != 0){   /*当指数不为0时*/
            if((exponent&1)==1)   /*等于1,则证明当前位数需要乘进结果*/
                res *= base;
            base*=base;
            exponent >>= 1;
        }
        return res;
  }

以base=3,exponent=6为例子,用表格记录每次操作

exponent base res 操作
110 3 1.0 刚开始
011 3*3=9 1.0 while第一次结果
001 9*9=81 1.0*9=9 while第二次结果
000 81*81 9*81=729 while第三次结果,exponent为0退出循环
剑指offer 文章被收录于专栏

为刷过的每一道题都书写一篇题解,便于重复练习~

全部评论
都没有注意到int的范围吗?直接取负号会导致越界
点赞 回复 分享
发布于 2021-03-03 21:15

相关推荐

01-24 12:50
门头沟学院 C++
投票
菜狗二号:还有啥想的 指定国有行啊,去了就开始幸福美满的生活了,选华子不是折腾自己么,最终财富积累度是差不多的,但是幸福指数是相差甚远的
点赞 评论 收藏
分享
02-08 20:56
已编辑
南京工业大学 Java
在等offer的比尔很洒脱:我也是在实习,项目先不说,感觉有点点小熟悉,但是我有点疑问,这第一个实习,公司真的让实习生去部署搭建和引入mq之类的吗,是不是有点过于信任了,我实习过的两个公司都是人家正式早搭好了,根本摸不到部署搭建的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务