示例 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来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/powx-n
public double myPow(double x, int n) {
//核心思想主要还是折半,把原本比较大的这个幂变成原来的一半,这样结果就可以通过这个一半的幂相乘来组成了
if (n == 0) {//任何数的0次幂都是1
return 1;
}
//把这个问题转换成更小的问题进行解决
double half = myPow(x,n/2);
//如果是个偶数的话,就正好是一半幂的乘积
if (n%2 == 0) {
return half*half;
}
//如果是奇数并且n>0的话
if(n > 0) {
return half*half*x;
}
return half*half/x;
}经典的把一个相对较大的问题使用折半的方法转换成较小的问题,代码注释中也写明了解释。
还有另一种相同的思想,只是用循环来实现的,如下:
public double myPow(double x, int n) {
double res = 1.0;
int i = n;
while (i != 0) {
//如果是奇数,那么还要多乘一个x
if (i%2 != 0) {
res *= x;
}
//偶数直接自我平方
x *= x;
//折半
i /= 2;
}
//判断n的正负来返回正确答案
return n < 0 ? 1/res : res;
}
版权声明:本文为zjg379569986原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。