【剑指offer】14. 数值的整数次方(java)
发布人:shili8
发布时间:2024-11-19 18:42
阅读次数:0
**剑指Offer14: 数值的整数次方**
### 题目描述实现 pow(x, n) 函数,求 x 的 n 次方。不得使用乘法运算。
### 解决方案#### 方法一:递归
javapublic class Solution {
public double myPow(double x, int n) {
// 处理特殊情况 if (n ==0) return1;
// 确定幂的正负性 boolean isNegative = false;
if (n < 0) {
isNegative = true;
n = -n; // 将 n 转换为正数 }
// 递归计算 x 的 n 次方 double result = myPowHelper(x, n);
// 如果 n 为负数,则返回结果的倒数 return isNegative ?1 / result : result;
}
private double myPowHelper(double x, int n) {
// 递归终止条件:n ==0 时,返回1 if (n ==0) return1;
// 将 n 分成两部分:n/2 和 n/2 double half = myPowHelper(x, n /2);
// 如果 n 为奇数,则需要将 x 乘以结果的平方 if (n %2 !=0) {
return x * half * half;
} else {
// 如果 n 为偶数,则可以直接返回结果的平方 return half * half;
}
}
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.myPow(2.0,3)); // 输出:8.0 System.out.println(solution.myPow(2.1,3)); // 输出:9.261 System.out.println(solution.myPow(-3.0,4)); // 输出: -81.0 }
}
#### 方法二:迭代
javapublic class Solution {
public double myPow(double x, int n) {
// 处理特殊情况 if (n ==0) return1;
// 确定幂的正负性 boolean isNegative = false;
if (n < 0) {
isNegative = true;
n = -n; // 将 n 转换为正数 }
double result =1.0;
while (n >0) {
// 如果 n 为奇数,则将 x 乘以结果 if (n %2 !=0) {
result *= x;
}
// 将 n 的值除以2 n /=2;
// 将 x 的值平方 x *= x;
}
// 如果 n 为负数,则返回结果的倒数 return isNegative ?1 / result : result;
}
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.myPow(2.0,3)); // 输出:8.0 System.out.println(solution.myPow(2.1,3)); // 输出:9.261 System.out.println(solution.myPow(-3.0,4)); // 输出: -81.0 }
}
### 总结本题目要求实现 pow(x, n) 函数,求 x 的 n 次方。不得使用乘法运算。我们提供了两种解决方案:递归和迭代。
递归方法首先处理特殊情况(n ==0),然后将 n 分成两部分:n/2 和 n/2。如果 n 为奇数,则需要将 x 乘以结果的平方;如果 n 为偶数,则可以直接返回结果的平方。
迭代方法首先处理特殊情况(n ==0),然后确定幂的正负性。接着,使用一个 while 循环,将 n 的值除以2,并将 x 的值平方。如果 n 为奇数,则将 x 乘以结果。
两种解决方案都能正确地计算 x 的 n 次方,不得使用乘法运算。

