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日

相关文章

  • vscode C++远程调试运行(学习C++用)

    下面是vscode C++远程调试运行的攻略: 准备工作 首先,我们需要在本地安装 Visual Studio Code 和 C++ 编译器,以及在远程服务器上安装 gdbserver 和相应的 C++ 编译器。 安装 Visual Studio Code:进入Visual Studio Code官网,下载并安装最新版本。 安装 C++ 编译器:如果你已经安…

    C 2023年5月23日
    00
  • C语言进制转换代码分享

    关于C语言进制转换代码分享的完整攻略,我将从如下几个方面进行详细讲解: 算法思路 代码实现 示例说明 1. 算法思路 进制转换主要是将一个数从一种进制转换为另一种进制,比如将二进制数转换为十进制数、将十进制数转换为十六进制数等。 其中,将一个整数从十进制转换为另一种进制的方法是通过除余法实现的。具体过程如下: 用被转换的数一直除以进制数(转换后的进制数),取…

    C 2023年5月24日
    00
  • 使用 Visual Studio 2022 开发 Linux C++ 应用程序的过程详解

    标题:使用 Visual Studio 2022 开发 Linux C++ 应用程序的过程详解 简介 Visual Studio 是一个面向开发人员的 IDE,可用于开发各种应用程序,其中就包括了 Linux C++ 应用程序的开发。 本文将详细介绍如何使用 Visual Studio 2022 开发 Linux C++ 应用程序。 步骤 步骤1:配置 Li…

    C 2023年5月23日
    00
  • C语言函数栈帧的创建与销毁详解

    C语言函数栈帧的创建与销毁详解 概述 在C语言中,当一个函数被调用时,系统会为这个函数创建一个函数栈帧(也称为活动记录),用于保存函数内部的变量、参数和函数返回地址等信息。当函数执行完毕后,系统会销毁该函数栈帧,释放内存。 函数栈帧的组成部分 函数栈帧一般由以下几部分组成: 函数参数:函数在调用时所传递的参数,存放在栈帧的底部; 函数局部变量:函数内部定义的…

    C 2023年5月23日
    00
  • C语言绘制余弦、正弦曲线

    C语言绘制余弦、正弦曲线 概述 余弦、正弦曲线是数学中的常见曲线,也是在编程中使用频率较高的一种图形绘制。本文介绍如何使用C语言编写代码绘制余弦、正弦曲线。 准备工作 在编写绘制余弦、正弦曲线的代码之前,需要先了解一些基本的几何概念和函数。 坐标系 在二维平面直角坐标系中,每个点都有两个坐标x和y,分别表示该点在水平和竖直方向上的位置。通常将该点表示为(x,…

    C 2023年5月23日
    00
  • 用C编写一个送给女朋友的情人节小程序 可爱!

    下面是“用C编写一个送给女朋友的情人节小程序 可爱!”的完整攻略: 目录 情人节小程序的设计思路 需要用到的C语言知识点 编写情人节小程序的步骤 示例说明 总结 情人节小程序的设计思路 情人节小程序是一款可爱的程序,旨在表达爱意。程序设计的主要部分是一个心形的图案,图案中有两个小人围绕一个爱心旋转,表示两个人相互依存,互相照顾,不离不弃的爱情。同时,程序还会…

    C 2023年5月23日
    00
  • C语言实现企业员工管理系统开发

    C语言实现企业员工管理系统开发攻略 1. 确定功能需求和数据结构 在开始编写代码之前,需要先确定功能需求和相应的数据结构。对于企业员工管理系统,通常需要包括以下功能: 添加员工 删除员工 修改员工信息 查询员工信息 显示员工列表 其中,员工的信息通常包括姓名、年龄、性别、职位等。根据这些需求,可以定义如下数据结构: // 定义 Employee 结构体,表示…

    C 2023年5月23日
    00
  • C语言预编译#define(预处理)

    C语言预处理#define的完整攻略 什么是C语言预处理 C语言预处理是在编译阶段之前进行的一些预处理操作,包括文件包含、宏定义、条件编译等等。其中,宏定义是其中最为常见的预处理操作,它使用预处理指令#define来定义一个标识符,以便在代码中进行替换。 预处理指令#define的语法 预处理指令#define的语法如下: #define 标识符 替换文本 …

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