Sword16——数值的整数次方

Sword16——数值的整数次方

方法1——快速幂

  • 思路:不能使用库函数,最简单方法就是不断累乘(x乘以x得x的平方,x的平方乘以自身得x的四次方),得出最后结果。其中需要注意一些特别值的处理,如0可直接返回0;负数需要转换为倒数
  • 理解 if ((m & 1) == 1) res *= x; 的作用举例
    • 第一次进行while循环后,2的10次方,此时等价于变为了4的5次方
    • 第二次进入while循环后,res记录此时为奇数的倍数,4的1次方,此时等价变为16的2次方(乘上之前的res)
    • 第三次进入while循环后,此时等价变为256的1次方(乘上之前的res)
    • 第四次进入while循环后,res记录此时为奇数的倍数,256的1次方,乘以之前记录的数,4的1次方,即256 * 4 = 1024;此时m归零,将退出while循环,返回res
  • 特殊情况与临界分析:x为0时,直接返回0
    • n为0为什么不需要单独列出呢?
    • 因为判断了底数不为0之后,任何数的0次方都为1,将会直接返回res初始值0
  • 终止条件:当n个x累乘完毕后终止
  • 步骤:
    • x为0时,直接返回0
    • 定义结果res
    • 因为n变为负数后可能int类型溢出(2的31次方变正数即溢出),因此将其转换为long类型的m
    • 当指数m为负数时,将其转换为(1/x)的(-m)次方
      • x = 1/x,m = -m
    • 循环条件:m大于0
    • while循环进行累乘
      • 针对m缩小一倍后可能出现奇数的特殊情况处理:将此结果先单独记录到res中即可(相当于m-1变为偶数因为在Java中,3右移1位,将会自动变为1)
      • x进行累乘自身
      • m缩小一倍,即右移一位
    • 循环退出,返回结果res
    public double myPow(double x, int n) {
        // x为0时,直接返回0
        if (x == 0) {
            return 0;
        }
        // 定义结果res
        double res = 1.0d;
        // 防止n的溢出,使用long类型的m替代
        long m = n;
        // 判断m是否为负数
        if (m < 0) {
            // 将x转换为(1/x)的(-m)次方
            x = 1/x;
            m = -m;
        }
        // while循环累乘
        while (m > 0) {
            // 针对m出现奇数情况处理,使用res保存一个x
            if ((m & 1) != 0) {
                res *= x;
            }
            // x累乘自身
            x *= x;
            // m右移一位
            m >>= 1;
        }
        // 返回结果
        return res;
    }

方法1——快速幂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值