题干
实现 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] 。
想法
最初想法就是正数直接n个相乘,负数转换成正数最后分之一…
代码如下:
double res=1;
int jue=0;
if(n>0){
jue=n;
}
else{
jue=-n;
}
if(n==0){
return res;
}
for(int i=0;i<jue;i++){
res*=x;
}
if(n>0){
return res;
}
else {
return 1/res;
}
显然简单的令人发指肯定不对,超时了。。
所以这道题两个重点:
1.如何快速
2.不越界
答案:
1.二分法相乘,x^n = x ^ 1/n * x ^ 1/n x ^ 1/n …
2.由于n为有符号整型变量,范围为-2147483648~2147483647,取最小值时,如果取绝对值会导致溢出,所以先将负数+1,最后多除一次x。(其实这道题题解并不影响…)
Java 代码
public class Solution {
public double myPow(double x, int n) {
if(n < 0){
// n为负返回倒数
return 1/pow(x, -n);
} else {
// n为正直接返回结果
return pow(x, n);
}
}
private double pow(double x, int n){
// 递归终止条件
if(n == 0){
return 1.0;
}
if(n == 1){
return x;
}
double val = pow(x, n/2);
// 根据奇数还是偶数返回不同的值
if(n % 2 == 0){
return val * val;
} else {
return val * val * x;
}
}
}
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;
}
x *= x;
}
return n <0 == true ? 1/res : res;
}
}
参考leetcode
https://segmentfault.com/a/1190000003756872