一、题目链接
https://leetcode.cn/problems/powx-n/
二、解题思路
三、实施步骤
四、Java程序
class Solution { // 第一种解决方案
/**
* 计算x的n次幂
*
* @param x double类型的浮点数,代表底数
* @param n int类型的整数,代表指数
* @return double类型的浮点数,代表x的n次幂
*/
public double myPow(double x, int n) {
if (n == 0) { // 任何数的0次幂都是1
return 1.0;
}
long N = n; // 预防n=-2^31时,-n超界
N = (N >= 0 ? N : -N); // 将负指数转为正指数
double ans = 1.0; // x的n次幂,初始时为1
/* 当指数未降阶到1时,持续指数折半降阶、底数平方提升的计算 */
while (N > 1) {
if (N % 2 == 1) { // 如果当前指数为奇数
ans = ans * x; // 需要留下一个当前的底数才能构成折半过程
}
N = N / 2; // 指数折半降阶
x = x * x; // 底数平方提升
}
ans = ans * x; // 将提升完毕的底数乘到结果上
return n >= 0 ? ans : 1 / ans; // 负指数计算出的结果需要取倒数
}
}
class Solution { // 第二种解决方案
/**
* 计算x的n次幂
*
* @param x double类型的浮点数,代表底数
* @param n int类型的整数,代表指数
* @return double类型的浮点数,代表x的n次幂
*/
/* 将n从int改为long是预防n=-2^31时,-n超界 */
public double myPow(double x, long n) {
if (n == 0) { // 任何数的0次幂都是1
return 1.0;
}
else if (n > 0 && n % 2 == 0) { // n为正数偶次幂时
return myPow(x * x, n / 2);
}
else if (n > 0) { // n为正数奇次幂时
return myPow(x, n - 1) * x;
}
else { // n为负数次幂时
return 1 / myPow(x, -n);
}
}
}