数值的整数次方

image.png

题目分析

首先看到整数次方,就可以用java自己的Math.pow函数,但本题要求不能使用库函数,所以就会想到分情况讨论然后执行for循环,这样是对的,但是超出时间限制
image.png
image.png

题解

二分法加递归

因为n可以分为正负0三种情况,所以当n为负数的使用就是-n左,然后x变为1/x,然后利用n如果是偶数那就是2递归n/2次,如果n是基数那就是n/2次再多乘一个x
image.png
二分法,递归很多次,比较耗内存

  • 最后的奇偶return可以用三元运算符代替:

    return (n%2==0)?res*res:res*res*x;
    

快速幂(二进制角度)

image.png
这个方法比较新奇,有点意思
因为将n转为2进制数,可以将n变为2的几次幂,然后x的n次方,就可以变成x的2的几次幂的方相乘,即n = 5,可以写成101,即5 = 12的2+02的1+12的0.然后x的5次方就可以变为,x的(12的2)x的(02的1)x的(12的0),也就是可以拆开乘

  • x的n次方,把n转二进制:"bm…b3b2b1"

    n = 1xb1+2xb2+4xb3+8xb4+16xb5+……+2^(m-1)bm
  • 于是x的n次方变为:

    X^[1xb1+2xb2+4xb3+8xb4+16xb5+……+2^(m-1)bm]
    =X^[1xb1]X^[2xb2]X^[4xb3]X^[8xb4]……X^[2^(m-1)bm]
    =二进制位为1才会乘
  • 注意右移的时候不用操作,直接移位即可,右移一位就是相当于除2,所以就每次都乘x方,然后判断最后一位是1还是0(和1与),是1就多乘一个x,不是就跳过直接返回
    image.png

    问题

    将n存入long再*-1,就可以避免,边界越界的错误。(但是不知道为什么思想一没有这个问题)
    image.png


Loccy
4 声望1 粉丝