Day3: 数值的整数次方(LeetCode剑指 Offer 16)

目录

一、题目

二、思路

什么是快速幂呢?

关于快速幂的实现:(只是实现思想)

三、代码实现

非递归:

递归:

四、两种方法的效果(leetcode给的参考)

1、非递归

2、递归


一、题目

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000

二、思路

一开始,我以为这是一个非常简单的问题,直接写了个for循环然后Wrong Answer...

之后通过快速幂的方法解决了这个题目

什么是快速幂呢?

就是逐渐去缩短求幂次数的过程,比如我要求3的10次幂,那么可以指数折半,基数翻倍,就变成求9的5次幂了。再比如说,我要求3的11次幂,那么我可以先将11分成1和10,那么result = 3*3^10,而3^10又可以像上面那样对半分,变成9^5...

循环次数大大减少,对于更大的数那就更不必说了。

关于快速幂的实现:(只是实现思想)

//假设基数是base,指数是n
while(n>0){
   if(n&1==1){
      //它是奇数
      result = result*base;
   }
   n = n>>1;
   base = base*base;
}

三、代码实现

非递归:

public static double myPow(double x, int n) {
        if(x==0){
            return 0;
        }
        if(n<0){
            x=1/x;
            n=-n;
        }
        double result = 1.0;
        long num = n;
        while(num>0){
            //n&1是位运算,按位比较两个数二进制码的数值,如果都是1,那么结果中对应位置也为1
            //如果是偶数,那么二进制码最后一位一定是0,所以和1与一定是0
            if((num&1)!=0){
                //如果是奇数,就把指数-1,然后给结果乘上一个基数
                result = result * x;
            }
            num = num>>1;
            x = x*x;
        }
        return result;
    }

递归:

public static double myPow2(double x, int n){
        if(x==0){
            return 0;
        }
        //由于int的二进制中负数和正数最后一位不一样,用long来接收n值进行位操作
        long num = n;
        if(n<0){
            x=1/x;
            num=-num;
        }
        return getPow(x,num);
    }

    public static double getPow(double x,long n){
        if(n==0){
            return 1;
        }
        if((n&1)!=0){
            return x*getPow(x*x,n>>1);
        }
        return getPow(x*x,n>>1);
    }

四、两种方法的效果(leetcode给的参考)

1、非递归

2、递归

 

可以看到,两种实现方法还是有一定差别的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值