LeetCode 50. Pow(x, n)(快速幂详解 | C语言实现)

一、题目描述

实现 pow(x, n) ,即计算 x 的整数 n 次幂函数。

复制代码
double myPow(double x, int n);

示例:

复制代码
示例 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/2^2 = 1/4 = 0.25

提示:

复制代码
-100.0 < x < 100.0
-2^31 <= n <= 2^31 - 1

二、解题思路

如果直接循环计算:

复制代码
x * x * x * x ... (n次)

时间复杂度是:

复制代码
O(n)

n 很大时效率会非常低。

因此需要使用 快速幂(Binary Exponentiation)

核心思想:

复制代码
x^10
10 的二进制 = 1010

x^10 = x^8 * x^2

计算时不断:

复制代码
底数平方
指数除2

例如:

复制代码
x^10

10 = 1010

x^10
= x^8 * x^2

通过二进制拆分,可以把复杂度降到:

复制代码
O(log n)

三、注意的坑

1 指数可能为负数

例如:

复制代码
x^-2 = 1 / x^2

因此需要先处理:

复制代码
if(n < 0)
{
    x = 1/x;
    n = -n;
}

2 INT_MIN 溢出问题

当:

复制代码
n = -2147483648

执行:

复制代码
-n

会溢出。

解决方法:

复制代码
使用 long long

四、方法一:快速幂(迭代实现)

算法步骤

循环过程中:

复制代码
如果当前二进制位为1 -> 乘入结果
底数平方
指数右移

例如:

复制代码
n = 10
二进制:1010

计算过程:

n result x
10 1 2
5 1 4
2 4 16
1 4 256
0 1024 65536

C语言代码

复制代码
double myPow(double x, int n) 
{
    long long N = n;

    if(N < 0)
    {
        x = 1 / x;
        N = -N;
    }

    double result = 1.0;

    while(N > 0)
    {
        if(N & 1)
        {
            result *= x;
        }

        x *= x;
        N >>= 1;
    }

    return result;
}

五、方法二:递归快速幂

利用递归思想:

复制代码
x^n = (x^(n/2))^2

如果 n 为奇数:

复制代码
x^n = (x^(n/2))^2 * x

C语言实现

复制代码
double fastPow(double x, long long n)
{
    if(n == 0)
        return 1;

    double half = fastPow(x, n / 2);

    if(n % 2 == 0)
        return half * half;
    else
        return half * half * x;
}

double myPow(double x, int n)
{
    long long N = n;

    if(N < 0)
        return 1 / fastPow(x, -N);

    return fastPow(x, N);
}

六、复杂度分析

时间复杂度:

复制代码
O(log n)

因为每次指数都:

复制代码
n / 2

空间复杂度:

复制代码
迭代:O(1)
递归:O(log n)

七、总结

本题核心是 快速幂算法,关键点有三个:

1️⃣ 指数转二进制计算

2️⃣ 处理负指数

3️⃣ 防止 INT_MIN 溢出

快速幂在很多题目中都会出现,例如:

复制代码
50. Pow(x,n)
191. 位1的个数
190. 颠倒二进制位
231. 2的幂
342. 4的幂

算法面试高频技巧之一


相关推荐
西柚研究生12345628 分钟前
论文分析17:YOLOv11_UAVNet:无人机航拍图像专用目标检测算法
人工智能·python·深度学习·算法·目标检测
hetao17338371 小时前
2026-09-17 hetao1733837 的刷题记录
c++·算法
午彦琳2 小时前
2026.9.17
数据结构·算法·leetcode
木井巳2 小时前
【记忆化搜索】不同路径
java·算法·leetcode·深度优先·剪枝·推荐算法
怕浪猫4 小时前
从 Windows 换到 Mac 三个月,我真香了
算法·面试·架构
free-elcmacom4 小时前
C语言指针进阶——指针数组模拟二维数组,以及二级指针到底怎么理解
c语言·visual studio code
aichitang20244 小时前
前端小skill
前端·人工智能·算法·ai·前端框架
山下梅子酒2254 小时前
洛谷-入门-B2049
c语言
All for pursuit.5 小时前
【链表-9】146.LRU缓存
数据结构·c++·算法·leetcode
木子算法5 小时前
测出来的值会抖:约束和目标带噪声时,「可行」和「更好」该怎么判
人工智能·算法·目标跟踪