实现 pow(x,n) ,即计算 x 的 n 次幂函数(即,)。不得使用库函数,同时不需要考虑大数问题。
示例:
输入:x = 2.00000, n = 10 输出:1024.00000
提示:
-100.0 < x < 100.0
-
<= n <=
-1
n
是一个整数- 要么
x
不为零,要么n > 0
。 -
<=
<=
题目分析
要求我们实现一个pow(x,n)函数,那么我们首先会想到暴力法求解,这种解法的时间复杂度太高,损失很大,可以考虑使用迭代法和递归实现。
迭代法
通过 =
*
=
,若n为奇数,那么就多出一个x,若n为偶数则正好。
每次迭代若n为奇数,先将res * x,然后将x平方并将n / 2;
其中取余和向下整除可以转化为位运算效率更高。
代码实现:
class Solution {
public double myPow(double x, int n) {
if(x == 0) return 0;
long b = n; //为了防止最小的负数转为正数越界
double res = 1.0;
if(b < 0) { //将负数转化为正数运算
x = 1 / x;
b = -b;
}
while(b > 0) {
if((b % 2) == 1){//若b为奇数,给res * x
res *= x;
}
x *= x; // 将x赋值为x平方
b /= 2; //b整除2
}
return res;
}
}
递归法
与迭代法思路相似,n为奇数时,需要再多乘一个x。
class Solution {
public double myPow(double x, int n) {
if (n == 0) {
return 1;
}
if (n < 0) {
return 1 / (x * myPow(x, -(n + 1)));
}
if (n % 2 == 0) { //n为偶数
return myPow(x * x, n / 2);
} else { //n为奇数
return x * myPow(x * x, n / 2);//与迭代法类似,需要多乘一个x
}
}
}