取模与取余
通常取模运算也叫取余运算,它们返回的结果都是余数。
对于整数a,b来说,取模运算或者取余运算的方法要分如下两步进行:
- 第一步:求整数商
c = a/b - 第二步:计算模或者余数
r = a - (c * b)
取模运算和取余运算唯一的差别在于第一步。
取模运算在计算整数商时,采用的是向负无穷大的方向取整。
取余运算在计算机整数商时,采用的是向0方向取整。
举个栗子:
a = 4 , b = -3
第一步: 4/(-3) = -1.333...3..3(无限循环)
对于取模运算,得到的整数商将为-2(向负无穷取整)
对于取余运算,得到的整数商将为-1(向0取整)
取模结果为 c = -2
取余结果为 c = -1
第二步:
对于取模运算,r = 4 - ((-2) * (-3)) = 2
对于取余运算,r = 4 - ((-1) * (-3)) = 1
故,取模结果为2,取余结果为1。
总结
-
如果a,b符号相同,得到的整数商必然大于0,因此取模运算和取余运算取整的方向相同,因此得到的结果相同。
-
如果a,b符号不同,得到的整数商必然小于0,取模运算向负无穷方向取整,取余运算向0方向取整,两个方向不同,得到的结果必然不同。并且取模运算得到的结果的符号与b的符号相同,取余运算的结果的符号与a的结果相同。
为什么取模运算结果的符号和b的符号相同,取余运算结果的符号和符号a相同呢?
这里穷举法证明一下,首先前提是a,b符号不同。
- a为正,b为负。得到的整数商为负,因为取模运算是向负无穷取整,假设得到的商为
-1.xxx(任意一个负数都成立,这里只是举个栗子),取整后变为c = -2,计算r = a - (c * b)时明显是不够减,得到的结果是负的,与b符号相同。而取余运算第一步取整后c = -1很明显够减,得到的结果是正的,与a符号相同。 - a为负,b为正。得到的整数商为负。原理一样,相信你自己也能证明。
C++中%作的是取余运算,python中的%作的是模运算。
觉得不错,点个赞呗!(小声bb)