c++求模运算的应用

2023-11-07

在 C\C++ 中,% 符号为求模运算符,即 a%b 表示 a 除以 b 的余数。

周期问题

我们在奥数中经常遇到这样的问题:

  1. 给你一串数字 4 5 6 4 5 6 4 5 6 ...,求这里的第 1000 个数字是几?

我们发现这是一个周期数列,周期为 3。

a. 如果将4看作第 1 个数,第 1000 个数一定是周期中的第 1 个数 4,因为前面 999 个数刚好是 333 组 456 构成的循环。

b. 如果将4看作第 0 个数,那么第 1000 个数此时就对应为第 999 个数,因为 999 模 3 余数为 0,同样对应的是 4。

  1. 给你一串数字 0 1 2 3 4 5 6 4 5 6 4 5 6...,求这里的第 1000 个数字是几?

这还是一个周期数列,周期为 3,但是它是从第 5 个数开始循环的,因此我们应该用 (1000-4) % 3,算出来是 0,这该怎么办呢?

针对这个问题,我们可以有两种处理方法:

(1)特殊处理:遇到 0 时,取周期中的最后一个数 6;

(2)统一处理:我们不要从 1 开始数,由于 % 运算会出现 0,因此我们就从 0 开始数。我们将第一个循环的数字 4 (目前是第 5 个数)变成第 0 个数,重新写算式 (1000-5) % 3,结果为 2,则 456 中,4 作为周期的第 0 个数,那么 6 就是第 2 个数。

练习题: 凯撒密码icon-default.png?t=N3I4https://www.mfstem.org/p/368

这一题里,每个字母都被变成它后面的第 3 个字母,因此直接将其 ASCII 码值加 3 即可。

但是,最后 3 个字母却遇到了问题,x→a,y→b,z→c,这个不是加 3 能够实现的。如何解决呢?

我们可以想象一下,把 26 个字母看成上面那样的循环:a,b,c,d,…,z,a,b,c,d,…,这样的话,当我们遇到x→a 的问题时,x 是第 23 个字母(从 0 开始数的),就相当于求第 26 个字母(计算23+3得到)是什么。那很容易想到,第 26 个字母就是 a。

 那么现在还有一个问题,就是在 C\C++ 中,'a' 是用 ASCII 值 97 存储的,其余字母的 ASCII 值依次是 98,99,…98,99,…,我们需要先将 'a' 看成第 0 个字母,因此,如果我们要对一个字母变量 alpha 进行凯撒加密,计算其后面第 3 个字母时,需要先执行 alpha-'a',然后再加 3,除以 26 取模,完整的算式应该是 (alpha - 'a' + 3) % 26 + 'a'

#include <iostream>
using namespace std;
int main() {
    char alpha;
    cin >> alpha;
    //这里 'a' 就是97,尽量不要写 97,而是直接用 'a' 表示,这样可读性更强。
    alpha = (alpha - 'a' + 3) % 26 + 'a';
    cout << alpha;
    return 0;
}

获取一个整数的个位、十位

我们可以通过 a%10 来求得整数 a 的个位,通过 a/10%10 来获得它的十位。

所以,我们要获取一个位,需要分两步:

(1)将这个位用除以一次或多次 10 的方法变成个位;

(2)用 %10 的方法获取现在的这个个位即可。

例如,659 % 10 得到个位的 9; 659/10%10 得到十位的 5;659/10/10%10 得到百位的 6。虽然可以通过 /100 直接获得 6,但是如果遇到更多位数的时候,我们后面会通过循环来实现这个操作,那么每次循环就只除以 10,即可依次获取从个位到最高位的所有位。

要获得某一位的值,就先把这个位通过除以 10 的整数次方,移动到个位,再模 10 即可。

求模运算的公式

​(1).(a+b+c)%M=(a%M+b%M+C%M)%M

(2).(a−b−c)%M=((a%M−b%M−C%M)%M+M)%M

(3).(a∗b∗c)%M=a%M∗b%M∗C%M

快速幂

#include <iostream>
typedef long long LL;
LL qpow(LL a, int b, int M) {
    LL ans = 1;
    while (b) {
        if (b & 1) ans = ans * a % M;
        a = a * a % M, b >>= 1;
    }
    return ans;
}
int main() {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    printf("%lld", qpow(a, b, c));
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++求模运算的应用 的相关文章

随机推荐

  • Python3 数据类型转换

    目录 Python3 数据类型转换 隐式类型转换 显式类型转换 Python3 数据类型转换 有时候 我们需要对数据内置的类型进行转换 数据类型的转换 一般情况下你只需要将数据类型作为函数名即可 Python 数据类型转换可以分为两种 隐式
  • js中int与string之间的转换

  • 关系型数据库和非关系型数据库

    数据库总结 关系型数据库和非关系型数据库 NOSQL 关系型数据库和非关系型数据库 NOSQL NoSQL 指的是非关系型的数据库 NoSQL有时也称作Not Only SQL的缩写 是对不同于传统的关系型数据库的数据库管理系统的统称 No
  • 护网HVV(蓝队)小白必知必会

    前言 在HVV期间 蓝队主要就是通过安全设备看告警信息 后续进行分析研判得出结论及处置建议 在此期间要注意以下内容 内网攻击告警需格外谨慎 可能是进行内网渗透 1 攻击IP是内网IP 攻击行为不定 主要包括 扫描探测行为 爆破行为 命令执行
  • 小金的2019年终总结

    文章目录 一 各平台年报 简书 中国移动 微信读书 支付宝 建设银行 二 值得说一说的事 我的舒适区 刷海贼王 致敬特斯拉惊叹达芬奇 小柠檬降世 当舅舅 换mac电脑 总结 一 各平台年报 简书 研究区块链 gt gt 投资简书 gt gt
  • 万字长文解析!复现和使用GPT-3/ChatGPT,你所应该知道的

    关于作者 英文原版作者 杨靖锋 现任亚马逊科学家 本科毕业于北大 硕士毕业于佐治亚理工学院 师从 Stanford 杨笛一教授 杨昊桐 译 王骁 修订 感谢靳弘业对第一版稿件的建议 感谢陈三星 符尧的讨论和建议 英文原版 https jin
  • 10.Vue简单项目之crud+表单验证

    Vue简单项目之crud 表单验证 1 准备工作 配置action js 2 新增书籍前台页面编写 3 修改和删除 4 表单验证 1 准备工作 配置action js 启动前端项目 启动后端项目 在action js中添加下列接口 BOOK
  • tomcat如何进行优化?

    对于tomcat的调优 可以从两个方面来进行调整 内存和线程 1 首先启动tomcat 实际上就是启动了一个jvm 所以可以jvm调优的方式来进行调整 从而达到tomcat调优的目的 另外tomcat中设计了一些缓存区 比如aappRead
  • npm link用法总结

    npm link用法总结 npm link用来在本地项目和本地npm模块之间建立连接 可以在本地进行模块测试 具体用法 1 项目和模块在同一个目录下 可以使用相对路径 npm link module 2 项目和模块不在同一个目录下 cd到模
  • Android 01:AutoCompleteTextView-简单实现实现自动输入文本效果

    在Android中 可以使用控件AutoCompleteTextView实现自动输入的文本功能 当用户输入一个字符 能够根据其字符提示显示出与之相关的数据 举大家一个熟悉的例子 当我们在百度中输入关键字 android 在列表中会出现相关的
  • C++程序分多文件编写

    为了让一个项目的结构更加清晰 需要学习函数的分文件编写 一般是4个步骤 创建后缀名为 h的头文件 创建后缀名为 cpp的源文件 在头文件中写函数的声明 在源文件中写函数的定义 主函数所在的源文件 要包含必要的头文件和这句using name
  • 测试用例逻辑梳理

    拿到一个页面怎么测 先看页面的整体布局 包括的内容是什么 页面之间的交互逻辑 按照总 分 总的逻辑测试 总 即总体概括页面的整体布局 包含的内容是什么 分 即是分模块对页面进行描述 页面包括的配置项是什么 输入框 搜索框 下拉框 分页 是否
  • 添加TAP虚拟网卡

    方法一 1 如果需要不同的Mac地址 可以添加虚拟网卡TAP 2 先安装uml utilities sudo apt get install uml utilities 3 使用tunctl添加虚拟网卡 sudo tunctl b 4 激活
  • stm32 web服务器实现

    最在做stm32 web服务器的东西 忙了一段时间终于弄完了 把这几天关于stm32服务器的工作记录一下 刚接到这个任务的时候 不知道怎么下手 网上资料似乎不是很多 于是在下载了一个官方demo测试了一下 看了一下代码 不是很懂 于是继续百
  • AWS EC2入门指南中创建和配置云虚拟机实例的基本步骤

    文章目录 创建 AWS 账户 登录 AWS 控制台 导航到 EC2 控制台 启动 EC2 实例 选择 AMI Amazon Machine Image 选择实例类型 配置实例 添加存储 审查和启动实例 创建密钥对 连接到 EC2 实例 管理
  • Python中的Lambda函数:简洁而强大的匿名函数

    引言 Python是一种功能强大且易于学习的编程语言 它提供了许多方便的语法和功能 以简化代码的编写和理解 其中之一就是Lambda函数 Lambda函数是Python中的一种匿名函数 它使得在需要函数对象的任何地方都能使用函数表达式 本文
  • 嵌入式系统开发项目管理

    项目生命周期五大阶段 1 项目启动阶段 1 项目可行性分析 一个成功的产品 应该从以下3个方面来观察评估 设计产品 商业行为 产品设计前 要做好市场调查和评估 要考虑产品的时效性 市场需求和技术可行性 产品设计结束后要写下详细的产品规格 技
  • L2TP详解(一)

    今天继续给大家介绍HCIE安全 本文给大家介绍的是L2TP相关内容 包括L2TP的特点和应用场景 一 L2TP简介 L2TP是一种二层的VPN技术 它提供了对PPP链路层数据帧的隧道传输支持 允许二层链路端点和PPP会话驻留在不同设备上 扩
  • 论文笔记:Constructing spatiotemporal speed contour diagrams: usingrectangular or non-rectangular paralle

    Constructing spatiotemporal speed contour diagrams using rectangular or non rectangular parallelogram cells 2019 Transpo
  • c++求模运算的应用

    在 C C 中 符号为求模运算符 即 a b 表示 a 除以 b 的余数 周期问题 我们在奥数中经常遇到这样的问题 给你一串数字 4 5 6 4 5 6 4 5 6 求这里的第 1000 个数字是几 我们发现这是一个周期数列 周期为 3 a