LeetCode记录:(50) 数值的整数次方,非常重要边界问题

LeetCode50 数值的整数次方,注意边界问题

  • 题目
  • 分析
  • 代码

题目

实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例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]

分析

这道题非常容易理解,但是需要考虑的边界情况很多。是一道较为经典的题目。
总结起来需要注意的细节有:
1、指数为0和负数的情况;
2、底数是0时。若指数项为负数,程序会崩溃;
3、对于0的0次方的定义;
4、计算机对小数的表示;
5、由于n为有符号整型变量,范围为-2147483648~2147483647,取最小值时,如果取绝对值会导致溢出。
6、除以2时,最好用右移操作。位运算的效率非常高。

代码

class Solution {
public:
    double myPow(double x, int n) {
        if(x==0 && n==0) return 1;    
        if((n==INT_MIN || n==INT_MAX) && (x>1 || x<-1)) return 0;
        if(x==1 && n==INT_MIN) return 1;   
        if(n==INT_MAX && (x==1 || x==-1)) return x;
        if(n==INT_MIN && (x==1 || x==-1)) return -x;   
        
        double res = 1.0;
        for(int i=abs(n); i > 0; i >>= 1) {
            if((i & 0x1) == 1)  res *= x;
            x *= x;
        }
        return n<0?1/res:res;       
    }
};

你可能感兴趣的:(Leetcode)