从C++和Python除法的区别谈谈求模(Modulus)和取余(Remainder)

今天发现一个很有意思的现象。

当做除法的时候,Python2和C++在负数的情况下会得到不同的整除结果:

当做-5 / 3的时候

C++的结果: -1

Python2的结果:-2

(请注意5 / -3的时候仍然会在C++中得到-1, Python2中得到-2)

可以看出C++在进行负数整除的时候执行的是直接舍去小数点后数字的操作,也就是返回和0比较接近的那个数字。

但在Python2中返回的则是小于等于商的最大整数,也就是返回和-∞更接近的数。

在做%操作的时候,依据的是这样的逻辑:

a = b * c + r

其中a是被除数,b是除数,c是商,r是%操作的结果。

在上述例子中,a和b是-5和3。

C++的情况下商c是-1,因此r可以算出来是-2。

Python情况下商c是-2,因此r可以算出来是1。

!!!值得注意的是:当把操作改成5 % -3的时候,C++的结果是2,Python2的结果是-1,和之前的结果正好符号相反。

如果有同学觉得这里非常乱,请牢记a = b * c + r。

用同样的逻辑,当a是5,b是-3时,c++因为商c是-1,因此r是2,Python时商c是-2因此r是-1。

那么造成这种差异的原因是什么呢?

其实是因为“求模”(Modulus)和“取余”(Remainder)的区别。

很多同学可能认为,求模运算和取余运算是一回事。实际上在正整数范围内它们确实表现出完全相同的性质。但在负数运算的情况下,它们则会表现出不同的行为。

C++的%表现出的是“取余”操作的结果。

Python的%表现出的是“求模”操作的结果。

无论C++还是Python,求模和取余都是根据a = b * c + r这个公式定义的,而唯一的区别就是商c究竟是向0方向取整还是向-∞方向取整。

当商c向0方向取整的时候,得到的r是“余数”,也就是在C++中的结果。

当商c向-∞方向取整的时候,得到的r是“模数”,也就是在Python2中的结果。

在Python3中,无论“/”两边是否均为整数,运算的时候都转换成实数运算并返回实数。整除则用“//”来表示。

利用Python这个整除的特性,我们可以得到一个小技巧:

很多时候我们会碰到“某物x个一组,一共需要y个,至少需要多少组?”这样的问题。

在C++中我们必须写成这样的逻辑:answer = y / x; if (y % x != 0) ans += 1;

在Python中我们可以利用负数的特性很方便地得到结果:answer = -(-y // x)。

时间: 2024-10-13 10:13:00

从C++和Python除法的区别谈谈求模(Modulus)和取余(Remainder)的相关文章

Matlab中取模(mod)与取余(rem)的区别

取模(mod)与取余(rem)是不同的,通常取模运算也叫取余运算,它们返回结果都是余数. rem和mod唯一的区别在于: 当x和y的正负号一样的时候,两个函数结果是等同的:当x和y的符号不同时,rem函数结果的符号和x的一样,而mod和y一样. 这是由于这两个函数的生成机制不同,rem函数采用fix函数,而mod函数采用了floor函数(这两个函数是用来取整的,fix函数向0方向舍入,floor函数向无穷小方向舍入). rem(x,y)命令返回的是x-n.*y,如果y不等于0,其中的n = fi

Python 2 和Python 3的区别

Python 2 和Python 3 的区别: 1. 直接运行python,其实是调用的python2,输入python3 ,其实是调用的是python3 2. 在python 2中需要提前标示出utf-8 的中文输入字符,# -*- coding: utf-8 -*-  或  #coding=utf-8 , 但是在python 3中可以直接输入,不用强调有中文: 3. 在python 2 和python 3中,在input 功能上有很大的区别,在python 中,input 是直接运算. py

PyCharm中Directory与Python package的区别

PyCharm中Directory与Python package的区别 对于Python而言,有一点是要认识明确的,python作为一个相对而言轻量级的,易用的脚本语言(当然其功能并不仅限于此,在此只是讨论该特点),随着程序的增长,可能想要把它分成几个文件,以便逻辑更加清晰,更好维护,亦或想要在几个程序中均使用某个函数,而不必将其复制粘贴到所有程序中. 为了支持这一点,Python有一种方法将定义函数放在一个文件中,并在脚本中使用它们,这样的文件叫做模块,一个模块中的定义可以被导入到其他模块,或

0 python和perl区别

help(dit.keys) ---使用帮助,查看字典类型中keys函数的说明 关于print python --- 字符串后面可以不用加\n 自动换行 per --- 不会自动换行,需加上\n 关于执行SQL语句. python与perl相同 使用变量来接收时,它是个二维数组, 每一条查询结果,即为一个一维数组, 每个字段,即为一维数组中的元素 ## 注意: 如果python执行SQL返回一行数据,则它为一维数组,返回多行数据,则为二维数组 python与perl区别在于: python使用f

java和python真的有区别吗?

Java和Python的特性区别! 这篇文章整合了java语言的特性和python语言的特性,希望可以帮到想要了解或初学编程的你! Python特性 Python是简单易学的:Python是一种代表简单主义思想的语言,它使你能够专注于解决问题而不是去搞明白语言本身.Python极其容易上手,因为Python有极其简单的说明文档. Python是速度快的:Python 的底层是用 C 语言写的,很多标准库和第三方库也都是用 C 写的,运行速度非常快. Python是免费.开源的:Python是FL

汇编总结:无符号除法,有符号除法,取余,无符号乘法,有符号乘法

本文分为3个模块. 示例---该指令的示例 解释---为指令不好理解的地方 练习---为了更熟悉该指令 1.1 有符号除法指令及取余example: 在c语言里要完成 8 / 2的汇编指令如下: 在c语言里要完成 8 % 2的汇编指令如下: 4个字节的除法及取余运算示例如下: .section .text .global _start _start:     movl $8, %eax   #被除数是%edx:%eax 是这两个寄存器拼起来的%eax存放低位%edx存储高位     movl %

2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展gcd, 不是用逆元吗.. 网上还有别人的解释,没看懂,贴一下: (a / b) % m = ( a % (m*b)) / b 笔者注:鉴于ACM题目特别喜欢M=1000000007,为质数: 当gcd(b,m) = 1, 有性质: (a/b)%m = (a*b^-1)%m, 其中b^-1是b模m的逆

除法和取余的运算时间

上次排队那题,让我发现减少取余的次数可以减少很多时间. 然后查到一篇文章 高频率调用的函数一定要保证最优化,慎用除法和余数 原po显示404,所以只有别人转载的. 就是说:除法.取余的指令 CPU周期 可以达到加减法的80倍(周期越多越耗时),因此高频率使用的函数里,以及循环次数很大的循环里,可以通过减少除法次数和取余次数来优化.里面介绍了一些方法,比如用乘法.减法代替. 然后又看到另一篇文章 取模.乘法和除法运算在CPU和GPU上的效率 意思是好像取模运算并没有想象中的那么慢 对于CPU,最好

python爬爬爬之单网页html页面爬取

python爬爬爬之单网页html页面爬取 作者:vpoet 日期:大约在夏季 注:随意copy 不用告诉我 #coding:utf-8 import urllib2 Response=urllib2.urlopen("http://www.baidu.com"); Html=Response.read(); print Html; 运行结果: 再看看百度的源码: 是一样,没骗你吧