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

数值的整数次方

描述

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

示例 1

输入

x = 2.00000, n = 10

输出

1024.00000

示例 2

输入

x = 2.10000, n = 3

输出

9.26100

示例 3

输入

x = 2.00000, n = -2

输出

0.25000

解释

2-2 = 1/22 = 1/4 = 0.25

提示

-100.0 < x < 100.0

-2^{31} \le n \le 2^{31}-1

-10^4 \le x^n \le 10^4

方法:快速幂

我们之前其实实现过快速幂的方法,就是对末位不断进行判断,为1则乘上权重,不为1则右移一位,每次右移都要更新权重的大小。

需要注意的是幂次n的范围,需要用long类型来存储,否则会范围溢出。

class Solution {
    public double myPow(double x, int n) {
        double res = 1;
        long b = n;
        if (x == 0) {
            return 0;
        }
        if (b < 0) {
            x = 1 / x;
            b = -b;
        }
        while (b != 0) {
            if ((b & 1) == 1) {//如果末位为1,加上权重
                res *= x;
            }
            x *= x;
            b >>= 1;//右移1位
        }
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_39478524/article/details/120541994