【剑指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 次方,不得使用乘法运算。