难度中等156收藏分享切换为英文接收动态反馈
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
示例 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
-231 <= n <= 231-1
-104 <= xn <= 104
本题需要考虑底数x,指数n,分别大于、等于、小于0等情况:
x=0, n<0:是非法输入;
n<0:将结果取倒数;
n=-2147483648的时候,不能对n直接取相反数。
double类型的两个数不能直接用(==)判断是否相等,要设置阈值。
C++代码(注释的也是一种解法)
// class Solution {
// //x=0 时, n不能为负数
// //需要判断n是否为负 然后决定是否取倒数
// public:
// double Power(double x, int n){
// if(n == 0) return 1;//奇数的最终右移结果是0
// if(n == 1) return x;//偶数的最终右移结果是1
// double res = Power(x, n>>1);
// res *= res;
// if((n & 0x1) == 1)
// //if(n & 1)//如果n是奇数 就需要多乘一次底数
// res *= x;
// return res;
// }
// bool equal(double a, double b){
// if((a - b) > -0.000001 && (a - b) < 0.000001)
// return true;
// else
// return false;
// }
// double myPow(double x, int n) {//调用函数
// if(equal(x, 0.0) && n < 0) return 0.0;
// double absn = n;
// if(n < 0 && n == INT_MIN) absn = -(absn + 1);//负数边界值-2147483648 转为正数是会溢出的
// else if(n < 0) absn = -n;
// double res = Power(x, absn);
// if(n < 0)
// res = 1.0 / res;
// if(x < 0 && n == INT_MIN) res *= -1;
// return res;
// }
// };
class Solution {
public:
double myPow(double x, int n) {
if(n==0) return 1;
//考虑到负数右移永远是负数,
if(n==-1) return 1/x;
if(n&1) return myPow(x*x, n>>1)*x;//如果当前n是奇数 递归回来到这的时候 需要多乘一次
else return myPow(x*x, n>>1);
}
};