LeetCode 剑指 Offer 16. 数值的整数次方
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
题解
考察了,二进制位能表示的最小负数数值转化的细节。
本题思路直白,是个裸的快速幂。但是有几个坑点,应当注意测试的严谨性。
坑点
- a = -1.0, b = -2^32
 如果采取先把负数转为正数,最后对结果取倒数的策略。因为b为32位,补码范围是-2^32(-2147483648) ~ 2^31-1。对-2147483648取反2147483648的补码最高位1被看做符号位,即-b仍等于-2147483648。没有得到预期效果。
- a = -2.0, b = -2^32
 b是无穷大,此时ans=0。
- a = 0, b = -2^32
 分母为零,无穷次幂是无穷大。
JAVA knowledge
- 最值表示方法
- Double最大值: Double.MAX_VALUE;
- Double最小值: Double.MIN_VALUE;
- Integer最大值: Integer.MAX_VALUE;
- Integet最大值: Integer.MIN_VALUE;
 
- 位运算时,最小值往往比最大值易出错
代码
public double myPow(double a, int b) {
    //   System.out.println("b1: " + b);
        double tmp = a;
        double ans = 1;
        int flag = 0;
        if(b == -2147483648) {
            if(a == 0) {
                return Double.MAX_VALUE;
            }
            b = 2147483647;
            flag = 2;
        }
        else if(b < 0) {
            flag = 1;
            b = -b;
    //        System.out.println("b2: " + b);
        }
        while(b != 0) {
            if((b & 1) != 0) {
                ans = ans * a;
            }
            a = a * a;
            b >>= 1;
        }
        if(flag == 1) {
            ans = 1 / ans;
        }
        else if(flag == 2) {
            ans = 1 / (ans * tmp);
        }
        return ans;
    }

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号