1、题目描述
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
示例 1:
输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3
输出:9.26100
示例 3:
输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
2、VS2019上运行
使用方法一:快速幂+递归;本质是分冶算法
#include <iostream>class Solution {
public:/*** @brief 计算 x 的 N 次方* @param x 底数* @param N 幂* @return x 的 N 次方结果*/double quickMul(double x, long long N) {// 递归终止条件: 当指数 N 为 0 时,底数的 0 次方结果为 1if (N == 0) {return 1.0;}// 递归计算底数 x 的 N/2 次方的结果double y = quickMul(x, N / 2);// 根据指数 N 的奇偶性来计算最终结果if (N % 2 == 0) {// 如果 N 为偶数,则底数的 N 次方等于底数的 N/2 次方乘以底数的 N/2 次方return y * y;}else {// 如果 N 为奇数,则底数的 N 次方等于底数的 N/2 次方乘以底数的 N/2 次方再乘以底数本身return y * y * x;}}/*** @brief 计算 x 的 n 次方* @param x 底数* @param n 幂* @return x 的 n 次方结果*/double myPow(double x, int n) {//将整数 n 转换为 long long 类型,以避免在取负数时产生溢出long long N = n;//分为N大于0和N小于0return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N); //x 的负指数等于 1 除以 x 的正指数}
};
int main() {Solution solution;double x = 2.0;int n = 10;double result = solution.myPow(x, n);std::cout << x << " 的 " << n << " 次方结果为:" << result << std::endl;return 0;
}
运行结果:
2 的 10 次方结果为:1024
3、解题思路
- 1.首先,判断递归终止条件:当指数 N 为 0 时,底数的 0 次方结果为 1。如果 N 等于 0,则直接返回 1.0。
- 2.当 N 不为 0 时,递归计算底数 x 的 N/2 次方的结果,即调用 quickMul(x, N / 2)。这里使用整数除法是为了保证能够递归到终止条件,当 N 奇数时能正确计算 N - 1 的结果。
- 3.得到底数 x 的 N/2 次方的结果为 y。
- 4.根据指数 N 的奇偶性来计算最终结果:
如果 N 为偶数,底数的 N 次方等于底数的 N/2 次方乘以底数的 N/2 次方,即返回 y * y。
如果 N 为奇数,底数的 N 次方等于底数的 N/2 次方乘以底数的 N/2 次方再乘以底数本身,即返回 y * y * x。 - 通过递归的方式,不断将指数 N 减半,直到 N 为 0,然后再将结果往上层递归返回,最终得到底数 x 的 N 次方的结果。