剑指Offer16.数值的整数次方 C++

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 

class Solution {
public:
    /**
     * @brief 计算 x 的 N 次方
     * @param x 底数
     * @param N 幂
     * @return x 的 N 次方结果
     */
    double quickMul(double x, long long N) {
        // 递归终止条件: 当指数 N 为 0 时,底数的 0 次方结果为 1
        if (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小于0
        return 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 次方的结果。

你可能感兴趣的:(剑指Offer刷题,c++,开发语言,力扣)