取模运算@求余运算@补数@负数除法和余数及其在不同编程语言程序设计中的区别

文章目录

    • abstract
      • 负数除以正数求余数
      • 带余除法回顾
    • 余数公式
      • 推导
      • 其他方案(负数除以正数求余)
      • 验算和检查
      • 程序设计中的取整
    • 取模运算和补数👺
      • 补数的概念
    • 常见程序设计语言中对取模运算的定义
      • python
      • c++

abstract

  • 取模运算@求余运算@负数除法和余数及其在不同编程语言程序设计中的区别

负数除以正数求余数

这里的负数,正数主要针对整数,以数论中的风格来讨论

这里基于带余除法来讨论负数除以整数计算余数的方法

计算正数除以负数求余数是我们经常接触的,负数除以正数求余数则相对少见,但是确实会出现在一些地方

带余除法回顾

a , b a, b a,b 是两个整数,其中 b > 0 b > 0 b>0,则[存在]惟一的一对整数 q q q r r r,使: a = b q + r a = bq + r a=bq+r(1), ( 0 ≤ r < b ) (0 \leq r < b) (0r<b), r = a − b q r=a-bq r=abq

从除法算式的角度,可以表示为被除数 ÷ \div ÷除数= 商 ⋯ 余数 商\cdots{余数} 余数;

  • 字母对应过来是 a , b , q , r a,b,q,r a,b,q,r,有 a ÷ b = q ⋯ r a\div{b}=q\cdots{r} a÷b=qr
  • 商是整数,可能为负数,0,正数,而关键的余数取值范围有严格要求,它是非负的,而且严格小于除数
  • 在数论或者计算机某些学科中,我们的取模运算要求操作数为整数,并且第二个操作数是正整数(但在任何地方都不能是0,否则会遇到除法错误,因为求余数涉及到除法,除数(也就是取模运算符的第二个操作数,不能为0))
  • (一般总是允许第一个操作数为任意整数),可以知道,第一个操作数为0时,第二个操作数非0时,取模结果为0
  • a < 0 a<0 a<0, b > 0 , r ⩾ 0 b>0,r\geqslant{0} b>0,r0时, q = ( a − r ) b < 0 q=(a-r)b<0 q=(ar)b<0,因此负数除以正数求余数时,一定要把商往负数考虑,同时要控制余数为不超过除数的正数
    • 负数 a a a除以正数 b b b如果能够整除,那么显然余数为0
    • 关键在于不能整除的情况下,确定商或者余数

在程序设计语言中,取模运算在处理负数时可能有不同的行为,(处理两个正数的行为一般是一样的)参考后面的章节

按照上述带余除法的要求,计算以下问题

  • − 1 m o d 5 -1\mod{5} 1mod5
    • − 1 = ( − 1 ) × 5 + 4 -1=(-1)\times{5}+4 1=(1)×5+4,所以 − 1 -1 1除以5的余数为4
  • − 6 m o d 5 -6\mod{5} 6mod5
    • − 3 = ( − 2 ) × 5 + 4 -3=(-2)\times{5}+4 3=(2)×5+4,所以 − 6 m o d 5 = 4 -6\mod{5}=4 6mod5=4

余数公式

  • 事实上,对于上述带余除法的条件下,我们有求正整数余数公式 r = a − b ⌊ a b ⌋ r=a-b\lfloor{\frac{a}{b}}\rfloor r=abba,其对于 a ∈ Z a\in\mathbb{Z} aZ都成立
    • 若令 q = ⌊ a b ⌋ q=\lfloor{\frac{a}{b}}\rfloor q=ba,则 r = a − b q r=a-bq r=abq;
    • a < 0 a<0 a<0时, q ⩽ − 1 q\leqslant{-1} q1,从而 − b q ⩾ b -bq\geqslant{b} bqb,这里有 q ∈ { − 1 , − 2 , ⋯ } q\in\set{-1,-2,\cdots} q{1,2,}, − b q ∈ { b , 2 b , 3 b , ⋯ } -bq\in\set{b,2b,3b,\cdots} bq{b,2b,3b,}
    • 特别的,若 a < 0 , ∣ a ∣ < ∣ b ∣ a<0,|a|<|b| a<0,a<b,则 r = a + b r=a+b r=a+b(1)
    • 结合性质同余性质 k m + c ≡ c ( m o d m ) km+c\equiv{c}\pmod{m} km+cc(modm),可以让我们更快的口算一些求余运算
  • 例如 − 21 m o d 5 -21\mod{5} 21mod5= ( − 4 × 5 − 1 ) m o d 5 (-4\times{5}-1)\mod{5} (4×51)mod5= − 1 m o d 5 -1\mod{5} 1mod5,在利用式(1),可得所求余数为4

推导

从带余除法 0 ⩽ r = a − b q < b 0\leqslant{r=a-bq}<b 0r=abq<b(2)入手;

我们尝试确定 q q q:

由式(2)可得 b q ⩽ a < b + b q bq\leqslant{a}<b+bq bqa<b+bq

那么 q ⩽ a b < 1 + q q\leqslant{\frac{a}{b}}<1+q qba<1+q,可见, q = ⌊ a b ⌋ q=\lfloor{\frac{a}{b}}\rfloor q=ba

由此观之 r = a − b q = a − b ⌊ a b ⌋ r=a-bq=a-b\lfloor{\frac{a}{b}}\rfloor r=abq=abba

公式 r = a − b ⌊ a b ⌋ r=a-b\lfloor{\frac{a}{b}}\rfloor r=abba对于 a ∈ Z a\in\mathbb{Z} aZ都成立

例如: − 6 m o d 5 -6\mod{5} 6mod5= − 6 − 5 ⋅ ( − 2 ) -6-5\cdot(-2) 65(2)= − 6 + 10 -6+10 6+10=4

− 21 m o d 5 -21\mod{5} 21mod5= − 21 − 5 ⋅ ( − 5 ) -21-5\cdot(-5) 215(5)= 4 4 4

其他方案(负数除以正数求余)

m , t m,t m,t为正整数,那么 ( − m ) m o d t (-m)\mod{t} (m)modt

− m = − ⌈ m / t ⌉ ⋅ t + r -m=-\lceil{m/t}\rceil\cdot{t}+r m=m/tt+r,则 r = ( − m ) m o d t r=(-m)\mod{t} r=(m)modt= ⌈ m / t ⌉ t − m \lceil{m/t}\rceil{t}-m m/ttm

如果令 q = ⌈ m / t ⌉ q=\lceil{m/t}\rceil q=m/t,则 r = q t − m r=qt-m r=qtm

例如: − 6 m o d 5 = 2 ⋅ 5 − 6 = 4 -6\mod{5}=2\cdot{5}-6=4 6mod5=256=4

验算和检查

要知道计算余数(取模)计算结果 r = a − b ⌊ a / b ⌋ r=a-b\lfloor{a/b}\rfloor r=aba/b是否错误(或者说是否有明显错误),可以检查 r r r的取值范围是否满足 0 ⩽ r < b 0\leqslant{r}<b 0r<b,如果不满足,那一定算错了

程序设计中的取整

一般在程序设计语言中,将一个浮点数类型转换为int时,会丢弃小数部分,直接保留整数部分,

这种情况下,若 a a a是一个小数,当 a > 0 a>0 a>0时,int(a)相当于向下取整;当 a < 0 a<0 a<0时,相当于向上取整,可以用一个数轴清晰的表示这个结论

在python等语言中,提供了//,可以用来做向下取整运算,例如-3//5=-1,而不是0

取模运算和补数👺

在学习补码时,我们会接触到模这个概念,以时钟上有12的12个点为例

补数的概念

在日常生活中,常会遇到“补数”的概念。例如,时钟指示6点,欲使它指示3点,既可按顺时针方向将分针转9圈,又可按逆时针方向将分针转3圈,结果是一致的。

假设顺时针方向转为正,逆时针方向转为负,则有:

6 - 3 = 3
6 + 9 = 15

由于时钟的时针转一圈能指示12个小时,这“12”在时钟里是不被显示而自动丢失的,即15-12=3,故15点和3点均显示3点。

这样-3和+9对时钟而言其作用是一致的。在数学上称12为模,写作mod 12,而称+9是-3以12为模的补数,记作:-3 ≡ +9 (mod 12),可以读作**-3和+9对模12同余**

mod k这个记号在数论中称为模k同余

或者说,对模12而言,-3和+9是互为补数的。

注意:从带余除法的角度, − 3 m o d 12 = 9 -3\mod{12}=9 3mod12=9,那么有同余的性质可知 − 3 , 9 -3,9 3,9对模 12 12 12同余,这个例子中余数为9,记为 − 3 ≡ 9 ( m o d 12 ) -3\equiv{9}\pmod{12} 39(mod12)

同理有:

-4 ≡ +8 (mod 12)
-5 ≡ +7 (mod 12)

即对模12而言,+8和+7分别是-4和-5的补数。

我们可以用 k m + c ≡ c ( m o d m ) km+c\equiv{c}\pmod{m} km+cc(modm)来生成类似的同余关系式;例如,取 k = − 1 , m = 12 k=-1,m=12 k=1,m=12, c ∈ 0 , 1 , 2 , ⋯ , 12 c\in{0,1,2,\cdots,{12}} c0,1,2,,12,比如 c = 1 c=1 c=1那么 − 11 ≡ 1 ( m o d 12 ) -11\equiv{1}\pmod{12} 111(mod12)

可见,只要确定了“模”,就可找到一个与负数等价的正数来代替此负数,这样就可以把减法运算用加法实现。

常见程序设计语言中对取模运算的定义

不同语言的取模运算对于两个正整数的定义或运算结果一般是相同的,但是其他情况结果不一定相同,可以通过查阅语言参考或者做实验来判断取模运算对于负数,小数的处理

python

  • Expressions — Python documentation这是python3对于二元运算的参考文档,其中包含了取模运算的定义
    • The % (modulo) operator yields the remainder from the division of the first argument by the second. The numeric arguments are first converted to a common type. A zero right argument raises the ZeroDivisionError exception. The arguments may be floating point numbers, e.g., 3.14%0.7 equals 0.34 (since 3.14 equals 4*0.7 + 0.34.) The modulo operator always yields a result with the same sign as its second operand (or zero); the absolute value of the result is strictly smaller than the absolute value of the second operand
  • 表达式 — Python 3文档 - Python 中文
    • 取模运算符 % 返回第一个参数除以第二个参数的余数。
    • 数值参数首先被转换为相同类型。右操作数为零会引发 ZeroDivisionError 异常。
    • 参数可以是浮点数,例如 3.14%0.7 等于 0.34(因为 3.14 等于 4*0.7 + 0.34)。
    • 取模运算符始终返回一个与第二个操作数符号相同的(或零)结果
    • 结果的绝对值严格小于第二个操作数的绝对值 [1]。
    • 基于这两点事实,我们可以用python的取模运算来计算数论中带余除法的余数,例如计算 − 3 m o d 5 = 2 -3\mod{5}=2 3mod5=2,其中2的绝对值小于第二个操作数5,并且符号和5相同
  • operator — 标准运算符对应函数 — Python 3 文档

c++

%操作符计算两个数相除的余数,第一个数被第二个数除。在C/C++中该操作符只能被应用在整值类型(char、short、int 和 long)的操作数上。

  • 当两个操作数都是正数时,结果为正。
  • 但是,如果有一个(或两个)操作数为负,余数的符号则取决于机器(或编译器实现)。因此,移植性无法保证。
  • %操作符被称作取模(modulus)或求余(remainder)操作符:
3.14 % 3; // 编译时刻错误:浮点操作数
21 % 6;   // ok: 结果是 3
21 % 7;   // ok: 结果是 0
21 % -5;  // 机器相关:结果为 -1 或 1int ival = 1024;
double dval = 3.14159;ival % 12;     // ok: 返回值在 0 和 11 之间
ival % dval;   // 编译时刻错误:浮点操作数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/18338.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

AIGC 入门全攻略:开启智能创作新时代

一、AIGC 初印象 AIGC&#xff0c;即人工智能生成内容&#xff0c;是继专业生产内容&#xff08;PGC&#xff09;、用户生产内容&#xff08;UGC&#xff09;之后的新型内容创作方式。它涵盖了文本生成、图像与视频创作、音频生成等多个领域&#xff0c;正在以惊人的速度改变着…

约克VRF地暖中央空调,让你舒适过冬

想要冬季过得舒服&#xff0c;采暖必须要到位&#xff01;对于没有集中供暖的南方地区来说&#xff0c;冬季室内阴冷刺骨。 选购地暖中央空调时&#xff0c;强效制热的能力必不可少&#xff0c;让我们可以享受温暖的室内温度&#xff0c;有效减少室内忽冷忽热的温度变化。 约克…

基于Java Springboot宠物领养救助平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

使用原生 OpenTelemetry 解锁各种可能性:优先考虑可靠性,而不是专有限制

作者&#xff1a;来自 Elastic Bahubali Shetti•Miguel Luna Elastic 现在支持使用 OTel Operator 在 Kubernetes 上部署和管理 Elastic Distributions of OpenTelemetry (EDOT)。SRE 现在可以访问开箱即用的配置和仪表板&#xff0c;这些配置和仪表板旨在通过 Elastic Observ…

基于python Django的boss直聘数据采集与分析预测系统,爬虫可以在线采集,实时动态显示爬取数据,预测基于技能匹配的预测模型

本系统是基于Python Django框架构建的“Boss直聘”数据采集与分析预测系统&#xff0c;旨在通过技能匹配的方式对招聘信息进行分析与预测&#xff0c;帮助求职者根据自身技能找到最合适的职位&#xff0c;同时为招聘方提供更精准的候选人推荐。系统的核心预测模型基于职位需求技…

安装 python-pcl 遇到的问题

安装python-pcl 成功安装错误尝试尝试一尝试二尝试三 本人环境 Ubuntu 22.04.4LTS ros2-humble cpython 3.0.11 python 3.10.12 libpcl-dev 1.12.1dfsg-3build1 pcl-tools 1.12.1dfsg-3build1 代码摘抄来源&#xff1a;Breadcrumbsouster-ros-extras/scripts/ros2_pcl_filters.…

【C++进阶篇】——string类的使用

文章目录 前言&#xff1a;1. string的介绍2. string类对象的常见构造3. string类对象的容量操作4. string类对象的访问5. 迭代器6. string类对象的修改操作7. string类对象的字符串运算8.string类成员函数9.string类非成员函数10.string类常量成员 前言&#xff1a; std::str…

vmware虚拟机给创建的centos扩展磁盘步骤

1.先看看原来的磁盘信息&#xff0c;目前磁盘是20g的&#xff0c;重点关注红色箭头指向的地方&#xff0c;一个17g 可用11g&#xff0c;接下来要对其进行扩展 df -h2.关闭当前虚拟机&#xff0c;先进行磁盘扩展&#xff0c;目前我扩展到了50g。 3.重新开启虚拟机&#xff0c;…

开源物业管理系统助力智能社区提升服务效率与用户体验

内容概要 开源物业管理系统是一种灵活、智能的解决方案&#xff0c;专为社区物业管理而生。随着智能社区的发展&#xff0c;这种系统变得越来越重要。它不仅帮助物业管理者高效地处理日常事务&#xff0c;还提升了居民的生活体验。在这个日新月异的时代&#xff0c;开源物业管…

深入理解 Redis跳跃表 Skip List 原理|图解查询、插入

1. 简介 跳跃表 ( skip list ) 是一种有序数据结构&#xff0c;通过在每个节点中维持多个指向其他节点的指针&#xff0c;从而达到快速访问节点的目的。 在 Redis 中&#xff0c;跳跃表是有序集合键的底层实现之一&#xff0c;那么这篇文章我们就来讲讲跳跃表的实现原理。 2. …

【数据库】mysql数据库迁移前应如何备份数据?

MySQL 数据库的备份是确保数据安全的重要措施之一。在进行数据库迁移之前&#xff0c;备份现有数据可以防止数据丢失或损坏。以下是一套详细的 MySQL 数据库备份步骤&#xff0c;适用于大多数情况。请注意&#xff0c;具体的命令和工具可能因 MySQL 版本的不同而有所差异。整个…

AWTK-WIDGET-WEB-VIEW 实现笔记 (4) - Ubuntu

Ubuntu 上实现 AWTK-WIDGET-WEB-VIEW 开始以为很简单&#xff0c;后来发现是最麻烦的。因为 Ubuntu 上的 webview 库是 基于 GTK 的&#xff0c;而 AWTK 是基于 X11 的&#xff0c;两者的窗口系统不同&#xff0c;所以期间踩了几个大坑。 1. 编译 AWTK 在使用 Linux 的输入法时…

Rocket入门练习

搭建部署&#xff1a; 1. 部署平台和部署方式&#xff1a; Ubuntu&#xff1a;22.10 部署方式&#xff1a;源码安装部署 a. 下载源码到本地&#xff1a;rocketmq-all-5.3.1-source-release.zip $ unzip rocketmq-all-5.3.1-source-release.zip // 解压缩 $ cd rocketmq-all…

视觉SLAM相机——单目相机、双目相机、深度相机

一、单目相机 只使用一个摄像头进行SLAM的做法称为单目SLAM&#xff0c;这种传感器的结构特别简单&#xff0c;成本特别低&#xff0c;单目相机的数据&#xff1a;照片。照片本质上是拍摄某个场景在相机的成像平面上留下的一个投影。它以二维的形式记录了三维的世界。这个过程中…

EM算法与高斯混合聚类:理解与实践

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

悬浮窗,ViewPager2内嵌套RecyclerView,RecyclerView高度异常的问题分析

1 背景 在一个Adnroid项目中&#xff0c;使用到了悬浮窗&#xff0c;其中有一个需求是以分页的显示显示媒体item&#xff0c;每一页中展示的媒体item是一个网格列表的形式显示的。 原型图如下&#xff1a; 2 实现方案 上述需求实现分页采用ViewPager2&#xff0c;在xml中的…

wordpress使用相关

这里写目录标题 遇到的相关问题WordPress安装插件过程中遇到需要ftp出现确实XMLReader 插件的提示cURL Support Missing&#xff08;curl 缺失&#xff09; 遇到的相关问题 WordPress安装插件过程中遇到需要ftp 一般在这个位置 出现确实XMLReader 插件的提示 解决&#xff1a…

安卓手机root+magisk安装证书+抓取https请求

先讲一下有这篇文章的背景吧&#xff0c;在使用安卓手机fiddler抓包时&#xff0c;即使信任了证书&#xff0c;并且手机也安装了证书&#xff0c;但是还是无法捕获https请求的问题&#xff0c;最开始不知道原因&#xff0c;后来慢慢了解到现在有的app为了防止抓包&#xff0c;把…

本草云端:中药实验管理的云服务

3系统分析 3.1可行性分析 通过对本中药实验管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本中药实验管理系统采用SSM框架&#xff0c;JAVA作为开发语…

pytest | 框架的简单使用

这里写目录标题 单个文件测试方法执行测试套件的子集测试名称的子字符串根据应用的标记进行选择 其他常见的测试命令 pytest框架的使用示例 pytest将运行当前目录及其子目录中test_*.py或 *_test.py 形式的所有 文件 文件内的函数名称可以test* 或者test_* 开头 单个文件测试…