leetcode50. Pow(x, n),快速幂算法

leetcode50. Pow(x, n),快速幂算法

实现 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

目录

总体思维导图

快速幂算法详解

算法背景

快速幂算法是一种高效计算 x n x^n xn 的方法,特别适用于 n n n 非常大的情况。它基于幂的性质和二进制表示。

算法原理

  1. 二进制表示 :任何整数 n n n 都可以用二进制表示。例如, 13 13 13 的二进制表示是 1101 1101 1101。
  2. 幂的性质 : x n x^n xn 可以分解为 x 2 0 × x 2 1 × x 2 2 × ... x^{2^0} \times x^{2^1} \times x^{2^2} \times \ldots x20×x21×x22×... 的形式。例如, x 13 x^{13} x13 可以分解为 x 1 × x 4 × x 8 x^{1} \times x^{4} \times x^{8} x1×x4×x8。
  3. 位操作 :通过检查 n n n 的二进制表示中的每一位,我们可以确定是否需要将对应的 x 2 k x^{2^k} x2k 乘入结果中。

算法步骤

  1. 初始化

    • 设置结果 res 为 1。
    • 将指数 n n n 转换为长整型 nn 以避免在负数时的整数溢出。
  2. 特殊情况处理

    • 如果 x = 1 x = 1 x=1,直接返回 x x x。
    • 如果 x = − 1 x = -1 x=−1,根据 n n n 的奇偶性返回 x x x 或 − x -x −x。
    • 如果 n < 0 n < 0 n<0,将 n n nn nn 设为正数,并将 x x x 设为其倒数。
  3. 快速幂计算

    • 使用 while 循环,当 n n > 0 nn > 0 nn>0 时执行。
    • 如果 n n nn nn 的当前最低位为 1(nn & 1),则将 r e s res res 乘以 x x x。
    • 将 n n nn nn 右移一位(nn >>= 1),即除以 2。
    • 将 x x x 平方(x = x * x)。
  4. 返回结果

    • 当 n n nn nn 变为 0 时,返回 res

算法优势

  • 时间复杂度降低 :传统的幂运算需要 O ( n ) O(n) O(n) 的时间复杂度,而快速幂算法只需要 O ( log ⁡ n ) O(\log n) O(logn)。
  • 减少乘法操作:通过跳过不必要的乘法,算法减少了计算量。

应用场景

快速幂算法常用于需要高效率幂运算的场合,例如密码学、大数运算等。

这个算法的关键在于利用了二进制的性质和位操作,从而将一个复杂的幂运算问题转化为一系列更简单的乘法和位移操作。

流程图

是 否 是 否 是 否 是 否 是 否 开始 特殊情况处理 底数x是否为1 返回1 底数x是否为-1 根据n的奇偶性返回结果 指数n是否小于0 取反n, 取倒数x 初始化res=1 循环处理 检查n是否为奇数 res *= x n >>= 1 x *= x n是否大于0 返回res 结束

具体代码

cpp 复制代码
class Solution {
public:
    double myPow(double x, int n) {
    double res=1;
    long long nn=(long long)n;
    if(x==1.00000)
    {
        return x;
    }
    if(x==-1.00000)
    {
        if(nn%2==1) return x;
        else return -x;
    }
    if(nn<0) 
    {
        nn=-nn;
        x=1/x;
    }
    while(nn)
    {
        if(nn&1) res*=x;
        nn>>=1;
        x=x*x;
    }
    return res;
    }
};

算法分析

  • 时间复杂度 : O ( log ⁡ n ) O(\log n) O(logn),因为每次循环 n n n 都至少减少一半。
  • 空间复杂度 : O ( 1 ) O(1) O(1),只使用了常数空间。
  • 易错点 :处理负指数和 x = − 1 x = -1 x=−1 的情况时容易出错。
  • 注意点 :使用 long long 类型处理大指数,防止整数溢出。

相似题目

下面是一些与快速幂算法相关的题目,您可能会感兴趣:

题目 链接
Pow(x, n) LeetCode
Super Pow LeetCode
Pow(x, n) II LintCode

这些题目都可以使用快速幂算法来解决。

相关推荐
蒸蒸yyyyzwd4 小时前
cpp 选手秋招学习笔记 day33
c++·笔记·求职招聘
wzdark8 小时前
基于堆的优先队列实现原理与复杂度分析4
算法
彧azz10 小时前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
老王熬夜敲代码10 小时前
BLAKE3:最快的密码学哈希函数
算法·密码学·哈希算法
hansang_IR11 小时前
【题解】P4460 [CQOI2018] 解锁屏幕
c++·算法
见闻小天地11 小时前
简博斯JG-C系列彩色激光同轴位移计:摄像头模组对位与行程测量的技术价值观察
人工智能·算法
ChampaignWolf11 小时前
在 SAP S/4HANA 内部基于 ICF Handler 从零实现 ABAP MCP Server:架构、代码与踩坑实录
c++·架构·sap·abap·mcp
葫三生12 小时前
《论三生原理》神话学构想与“神话历史”理论、《古史中的神话》思路异同?
大数据·人工智能·科技·深度学习·算法
liliangcsdn12 小时前
因子分析指标概念与示例
算法·机器学习
尘客-追梦13 小时前
Day 01:插件化之前,先看清 ABI 这堵墙
开发语言·c++·qt