【发布时间】:2011-02-09 11:52:23
【问题描述】:
我真的不明白模除法是如何工作的。
我在计算27 % 16,最后得到11,我不明白为什么。
我似乎无法在网上找到通俗易懂的解释。 有人可以详细说明这里发生了什么吗?
【问题讨论】:
标签: language-agnostic math modulo division
我真的不明白模除法是如何工作的。
我在计算27 % 16,最后得到11,我不明白为什么。
我似乎无法在网上找到通俗易懂的解释。 有人可以详细说明这里发生了什么吗?
【问题讨论】:
标签: language-agnostic math modulo division
modulo division 的结果是给定数字的integer division 的余数。
这意味着:
27 / 16 = 1, remainder 11
=> 27 mod 16 = 11
其他例子:
30 / 3 = 10, remainder 0
=> 30 mod 3 = 0
35 / 3 = 11, remainder 2
=> 35 mod 3 = 2
【讨论】:
模除就是这样:将两个数相除,只返回余数
27 / 16 = 1,剩下 11 个,因此 27 % 16 = 11
同上 43 / 16 = 2 剩下 11 所以 43 % 16 = 11 也是
【讨论】:
很简单:a % b 定义为a 除以b 的余数。
有关更多示例,请参阅wikipedia article。
【讨论】:
模数除法给出除法的余数,而不是商。
【讨论】:
也许时钟的例子可以帮助你理解模数。
模算术的一个常见用途是它在 12 小时制中的使用,其中一天分为两个 12 小时时段。
假设我们目前有这个时间:15:00
但你也可以说是 下午 3 点
这正是模的作用:
15 / 12 = 1, remainder 3
你会发现这个例子在 wikipedia 上有更好的解释:Wikipedia Modulo Article
【讨论】:
大多数解释都遗漏了一个重要步骤,让我们用另一个例子来填补空白。
鉴于以下情况:
Dividend: 16
Divisor: 6
模函数如下所示:
16 % 6 = 4
让我们确定这是为什么。
首先,执行integer division,这与普通除法类似,只是丢弃了任何小数(也称为余数):
16 / 6 = 2
然后,将上述除数 (2) 与我们的 除数 (6) 相乘:
2 * 6 = 12
最后,从我们的红利 (16) 中减去上述乘法的结果 (12):
16 - 12 = 4
这个减法的结果,4,余数,与我们上面的模数的结果相同!
【讨论】:
16 // 6 >>> 2 和 16 / 6 >>> 2.6666666666666665
模数运算符采用除法语句并返回计算中剩下的任何内容,即“剩余”数据,可以说,例如 13 / 5 = 2。这意味着,还有 3 个剩余或剩余那个计算。为什么?因为 2 * 5 = 10。因此,13 - 10 = 3。
模数运算符为您完成所有计算,13 % 5 = 3。
【讨论】:
很简单,取模运算符(%)返回整数除法后的余数。让我们以你的问题为例。 27% 16 = 11 怎么算?当您简单地将 27 除以 16 即 (27/16) 时,余数为 11,这就是您的答案为 11 的原因。
【讨论】:
计算模数的简单公式是:-
[Dividend-{(Dividend/Divisor)*Divisor}]
所以,27 % 16 :-
27- {(27/16)*16}
27-{1*16}
答案= 11
注意:
所有计算都使用整数。在小数商的情况下,小数点后的部分将被忽略/截断。
例如:27/16= 1.6875 在上述公式中仅被视为 1。 0.6875 被忽略。
计算机语言的编译器也以相同的方式处理带小数部分的整数(通过截断小数部分)
【讨论】:
假设你有 17 个 mod 6。
总共 6 将使您最接近 17,它将是 12,因为如果您超过 12,您将有 18,这比 17 mod 6 的问题更多。然后,您将从 17 中取 12 减去会给你答案,在这种情况下是 5。
17 模 6=5
【讨论】:
小数点后的数字 (0.xxx) 较短时会更容易。然后你需要做的就是将该数字乘以除法后的数字。
例如:32 % 12 = 8
你做32/12=2.666666667
然后你扔掉2,专注于0.666666667
0.666666667*12=8
(同样,只有小数点后的数字很短时才容易)
【讨论】:
我希望这些简单的步骤会有所帮助:
20 % 3 = 2
20 / 3 = 6;不要包含.6667 - 忽略它3 * 6 = 1820 - 18 = 2,是模的余数【讨论】:
模数除法非常简单。它使用余数而不是商。
1.0833... <-- Quotient
__
12|13
12
1 <-- Remainder
1.00 <-- Remainder can be used to find decimal values
.96
.040
.036
.0040 <-- remainder of 4 starts repeating here, so the quotient is 1.083333...
13/12 = 1R1,因此 13%12 = 1。
将模数视为一个“循环”会有所帮助。
换句话说,对于表达式n % 12,结果将始终为
这意味着0..100 的集合n % 12 的序列是:
{0,1,2,3,4,5,6,7,8,9,10,11,0,1,2,3,4,5,6,7,8,9,10,11,0,[...],4}
从这个角度来看,模数及其用途变得更加清晰。
【讨论】:
写出一个以0开头的表格。
{0,1,2,3,4}
按行继续表格。
{0,1,2,3,4}
{5,6,7,8,9}
{10,11,12,13,14}
第一列中的所有内容都是 5 的倍数。第二列中的所有内容都是 5 的倍数,余数为 1。现在是抽象部分:你可以写 (1) 作为 1/5 或作为小数扩展。模运算符仅返回 列,或者以另一种思维方式,它返回 long 的余数 分配。您正在处理模(5)。不同的模数,不同的表。 想想哈希表。
【讨论】:
当我们将两个整数相除时,我们将得到一个如下所示的等式:
A/B=Q余数R
A 是股息; B 是除数; Q是商,R是余数
有时,我们只对 A 除以 B 的余数感兴趣。 对于这些情况,有一个称为模运算符(缩写为 mod)的运算符。
例子
16/5= 3 Remainder 1 i.e 16 Mod 5 is 1.
0/5= 0 Remainder 0 i.e 0 Mod 5 is 0.
-14/5= 3 Remainder 1 i.e. -14 Mod 5 is 1.
更多信息请参见Khan Academy Article。
在计算机科学中,哈希表使用 Mod 运算符来存储元素,其中 A 是哈希后的值,B 是表的大小,R 是插入元素的槽数或键数。
【讨论】:
这是我理解模数运算符的最佳方法。我将通过示例向您解释。
16 % 3
当你将这两个数相除时,余数就是结果。我就是这样做的。
16 % 3 = 3 + 3 = 6; 6 + 3 = 9; 9 + 3 = 12; 12 + 3 = 15
那么剩下的 16 就是 1
16 % 3 = 1
这里还有一个例子:16 % 7 = 7 + 7 = 14 16 还剩下什么?是216 % 7 = 2
还有一个: 24 % 6 = 6 + 6 = 12; 12 + 6 = 18; 18 + 6 = 24。所以余数为零,24 % 6 = 0
【讨论】:
我还想补充一点:
当被除数大于/大于除数时,很容易计算模数
股息 = 5 除数 = 3
5 % 3 = 2
3)5(1
3
-----
2
但是如果除数小于被除数怎么办
股息 = 3 除数 = 5
3 % 5 = 3 ??怎么样
这是因为,因为 5 不能直接除以 3,所以取模就是被除数
【讨论】:
唯一需要理解的重要一点是,模数(这里用 C 中的 % 表示)是通过 欧几里得除法 定义的。
对于任何两个(d, q) 整数,以下是总是正确的:
d = ( d / q ) * q + ( d % q )
如您所见,d%q 的值 取决于 d/q 的值。通常对于正整数,d/q向零截断,例如 5/2 给出 2,因此:
5 = (5/2)*2 + (5%2) => 5 = 2*2 + (5%2) => 5%2 = 1
但是对于负整数,情况不太清楚,取决于语言和/或标准。例如 -5/2 可以返回 -2(像以前一样向零截断)但也可以返回 -3(使用另一种语言)。
第一种情况:
-5 = (-5/2)*2 + (-5%2) => -5 = -2*2 + (-5%2) => -5%2 = -1
但在第二个中:
-5 = (-5/2)*2 + (-5%2) => -5 = -3*2 + (-5%2) => -5%2 = +1
如前所述,只需记住不变量,即欧几里得除法。
更多详情:
【讨论】:
27 % 16 = 11
你可以这样解读:
16 在通过之前进入 27 1 次。
16 * 2 = 32。
所以你可以说 16 是 27 中的一次,余数是 11。
其实
16 + 11 = 27
另一个例子:
20% 3 = 2
Well 3 在通过之前 6 次进入 20。
3 * 6 = 18
要加起来 20,我们需要 2,所以模数表达式的余数是 2。
【讨论】: