实现 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)暴力解法,当n<0循环遍历,当n大于0循环遍历,提交之后超出时间限制
class Solution {
public double myPow(double x, int n) {
double result = 1.0;
if(n == 0)
return 1.0;
//当N小于0
if(n < 0){
while(n != 0){
result = result * x;
n++;
}
return 1/result;
}else{
//当n大于0
while(n != 0){
result = result * x;
n--;
}
}
return result;
}
}
2)递归分治
不熟悉递归分治的同学可以浏览一下这篇博文
https://blog.csdn.net/qq_38765867/article/details/88360034
x的N次幂,
n为偶数:可以想到如果n为偶数,那么刚好可以分成两部分来进行计算,然后再把计算结果再相乘。即,y = , result = y * y.
n为奇数:y = ,结果为result = x * y * y.
n如果小于0,把n变成-n,结果再变成1/result.
我们让i初始化为n,然后看i是否是2的倍数,是的话x乘以自己,否则res乘以x,i每次循环缩小一半,直到为0停止循环。最后看n的正负,如果为负,返回其倒数
class Solution {
public:
double myPow(double x, int n) {
double res = 1.0;
for (int i = n; i != 0; i /= 2) {
if (i % 2 != 0)
res *= x;//i为奇数
x *= x;
}
return n < 0 ? 1 / res : res;
}
};
楼主自己写的一个代码因为溢出问题解决不了,
class Solution {
public double myPow(double x, int n) {
if(n == 0)
return 1.0;
if(n < 0){//比0小
return (1.0 / myPow(x,-n));
}
if(n % 2 == 1){//n%2,奇数为1,当n为奇数的时候
return x * myPow(x,n-1);
}
return myPow(x*x,n/2);
}
}