c++入门必学算法之快速幂思想及实现

以下是“C++入门必学算法之快速幂思想及实现”的攻略。

教程概述

快速幂是一种计算幂运算(类似于指数运算)的高效算法。在求解幂运算时,我们通常是采用暴力方法进行连乘,这样的时间复杂度为 $O(n)$,效率较低。而快速幂算法能够在 $O(log_2(n))$ 的时间复杂度内完成幂运算,提高了计算效率。

在本教程中,我们将会介绍快速幂算法的思想和具体实现方法,并提供两条示例说明,帮助大家更好地理解此算法。

快速幂算法思想

快速幂算法的思想是将指数 $n$ 转化为二进制数形式,通过对于每一位的计算结果进行累乘的方式求解幂运算。

例如,当要计算 $a^n$ 时,我们可以将指数 $n$ 转化为二进制数的形式,然后对于每一个非零二进制位 $i$,都计算 $a^{2^i}$,并将结果累乘。例如,当 $n=13$ 时,二进制形式为 $1101$:

$$
a^{13} = a^{2^0} \times a^{2^2} \times a^{2^3}
$$

尽管看起来需要进行 $log_2(n)$ 次计算,但事实上每一次计算都是上一次计算结果的平方,因此在快速幂算法中,只需要使用循环和累乘和平方运算,即可完成高效的幂运算。

快速幂算法实现

以下是快速幂算法的具体实现过程。

long long qmi(long long a, long long b, long long p) {
    long long res = 1 % p;
    while(b) {
        if(b & 1) res = res * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return res;
}

函数 qmi 用于计算快速幂运算。

其中,a 表示底数,b 表示指数,p 表示模数。

函数从初始值 res=1 开始循环,每次将指数 $b$ 与 1 做位运算,如果为 1,则将底数乘到结果中,否则不做任何操作。然后对底数进行平方,将指数右移一位,继续循环,直到指数为 0。最后返回结果即可。

示例说明

示例一:求幂模运算

接下来,我们给出一个示例,使用快速幂算法进行幂模运算。

假如我们需要计算 $2^{123456789}$ 除以 $987654321$ 的余数,直接进行连乘显然不可行,此时可以使用快速幂算法来进行快速计算。

首先,我们对 $123456789$ 进行二进制转化。可以得到:

$$
123456789_{10}= 1110101101110111100111010101_{2}
$$

然后使用快速幂算法即可:

long long a = 2, b = 123456789, p = 987654321;
cout<<qmi(a, b, p)<<endl;

输出结果为:

131176846

示例二:使用快速幂算法求斐波那契数列

我们可以用快速幂算法来求解斐波那契数列的第 $n$ 项,而不需要使用递归方法求解大量重复子问题。

斐波那契数列的公式如下:

$$
F_n=F_{n-1}+F_{n-2} \ \ (n>=2,F_0=0,F_1=1)
$$

假设我们需要求解斐波那契数列的第 $10$ 项 $F_{10}$。

使用快速幂算法,可以极大地缩短计算时间复杂度。具体实现如下:

long long a = 1, b = 1, p = 1e9 + 7;
for(int i = 2; i <= 10; i++) {
    int t = b;
    b = (a + b) % p;
    a = t;
}
cout<<b<<endl;

在循环中,我们从 $F_2$ 开始,每次将 $b$ 更新为 $F_{i+1}$,$a$ 更新为 $F_i$(具体原因是为了便于计算),然后通过斐波那契数列的公式进行计算。最终我们能够得到斐波那契数列的第 $10$ 项:

55

总结

本教程主要介绍了快速幂算法的思想和使用方法,并提供了两个示例进行说明。在实际的编程中,快速幂算法具有广泛的应用价值,能够用于高精度计算、求解幂模运算、求解斐波那契数列等问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++入门必学算法之快速幂思想及实现 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • QT连接Mysql数据库的实现步骤

    好的。首先,我们需要安装 Qt 和 mysql 的相关驱动程序。安装完后,我们可以开始进行以下步骤: 步骤一:加载 mysql 驱动 在 Qt 中连接 mysql 数据库之前,我们需要在程序中先加载 mysql 驱动。在通常情况下,mysql 驱动是通过插件的方式来实现的。我们需要在项目的.pro 文件中加入以下代码: QT += sql QT += sql…

    C 2023年5月23日
    00
  • C 标准库 errno.h

    让我们来详细讲解一下 C 标准库 errno.h 的使用攻略。 什么是 errno? errno 是 C 标准库中的一个全局变量,其类型为 int,用于表达函数或操作的错误码(错误编号)。如果一个函数或操作执行出错,其返回值可能无法明显地反映错误的信息,此时可以通过 errno 变量获取更详细的错误信息。errno 的具体取值由库函数或系统调用设置。 系统调…

    C 2023年5月10日
    00
  • iOS 14.3/iPadOS 14.3开发者预览版 Beta 2(18C5054c)怎么升级?

    下面是 iOS 14.3/iPadOS 14.3 开发者预览版 Beta 2 升级的完整攻略,包括两条示例说明: iOS 14.3/iPadOS 14.3 开发者预览版 Beta 2 升级攻略 1. 准备工作 在升级前,请务必备份你的设备数据以防意外情况发生。此外,为了能够顺利升级,你还需要: 确保你的设备支持升级到 iOS/iPadOS 14.3 开发者预…

    C 2023年5月23日
    00
  • C++实现比较日期大小的示例代码

    让我来为您深入讲解一下“C++实现比较日期大小的示例代码”的完整攻略。 前置知识 在了解如何使用 C++ 实现比较日期大小之前,我们需要了解以下基础概念:时间戳和结构体。 时间戳是指自 1970 年 1 月 1 日 00:00:00 UTC 至现在的总秒数。在 C++ 中,我们可以使用 time_t 类型来表示时间戳。 结构体是由一系列不同类型的数据组成的自…

    C 2023年5月23日
    00
  • C语言实现推箱子游戏的代码示例

    很高兴为你介绍如何用C语言实现推箱子游戏的代码示例。推箱子游戏是一款经典的益智游戏,通过在有限空间内推动箱子达到目标位置,考验玩家的空间思维和逻辑思维。下面详细讲解实现该游戏的完整攻略。 环境搭建 在开始Coding之前,首先需要在本地计算机上安装C语言开发环境,如IDE(集成开发环境)、编译器等。推荐使用Visual Studio Code(简称VS Co…

    C 2023年5月24日
    00
  • C++实现四叉树效果(附源码下载)

    C++实现四叉树效果(附源码下载) 四叉树也称为四元树或者八叉树,是一种树形数据结构,其特点是每个内部节点有四个子节点或是八个子节点。四叉树在计算机图形学和图像处理领域中得到了广泛应用。本文将讲解如何用 C++ 实现四叉树,并提供源码下载。 实现思路 基本概念 四叉树的基本概念是将二维空间划分为四个象限,每个象限为一个节点。每个节点又可以继续向下划分,直到一…

    C 2023年5月23日
    00
  • ps中怎么制作水火交融的字体效果?

    要制作水火交融的字体效果,可以使用Photoshop中的图层样式,具体步骤如下: 创建文字图层 在Photoshop中创建一个新的文档,然后选择文字工具在文档中添加一个文本。可以选择任何字体、任何颜色的文本,具体根据个人需要来定。 添加渐变图层样式 在图层面板中,选择文本图层。然后在图层面板顶部的图层样式(fx)图标上点击鼠标右键,选择“渐变叠加”选项,在弹…

    C 2023年5月23日
    00
  • C++有限状态机实现计算器小程序

    C++有限状态机实现计算器小程序攻略 1. 什么是有限状态机? 有限状态机(FSM, Finite State Machine)是一种数学模型,它可以通过状态转移来描述一个系统的行为。在有限状态机中,系统从一个状态转移至另一个状态,这是通过一些输入(input)或者事件(event)来触发的。有限状态机包含三个要素: 状态集合 输入集合 状态转移 2. 怎样…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部