offer 16 数值的整数次方

数值的整数次方

image.png

题目分析

首先看到整数次方,就能够用java本身的Math.pow函数,但本题要求不能使用库函数,因此就会想到分状况讨论而后执行for循环,这样是对的,可是超出时间限制
image.png
image.pngjava

题解

二分法加递归

由于n能够分为正负0三种状况,因此当n为负数的使用就是-n左,而后x变为1/x,而后利用n若是是偶数那就是2递归n/2次,若是n是基数那就是n/2次再多乘一个x
image.png
二分法,递归不少次,比较耗内存函数

  • 最后的奇偶return能够用三元运算符代替:spa

    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),也就是能够拆开乘code

  • 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.pngit

    问题

    将n存入long再*-1,就能够避免,边界越界的错误。(可是不知道为何思想一没有这个问题)
    image.pngfor循环

相关文章
相关标签/搜索