了解模运算符 %
Posted
技术标签:
【中文标题】了解模运算符 %【英文标题】:Understanding The Modulus Operator % 【发布时间】:2013-07-05 16:04:00 【问题描述】:我根据以下表达式理解模运算符:
7 % 5
这将返回 2,因为 5 进入 7 一次,然后给出剩下的 2,但是当您将这个语句反转为阅读时,我的困惑就来了:
5 % 7
这给了我 5 的值,这让我有点困惑。虽然 7 的整体没有进入 5,但它的一部分确实如此,为什么没有余数或正负 2 的余数?
如果它是根据 7 根本不进入 5 的事实来计算 5 的值,为什么余数不是 7 而不是 5?
我觉得在我对模数运算符的理解中缺少一些东西。
【问题讨论】:
模数是“绝对值”。您指的是与余数有关的“模”。很遗憾,这两个词太相似了,以至于让很多人绊倒。 我遇到了小数和负数的问题,在这里找到了答案:***.com/questions/48662225/… 它是 remainder 运算符。不是“模运算符”。1 % 500
返回 1
让我感到困惑,但如果您手动进行长除法,1 将完全变为 500,没有任何余数(但它会是小数结果) .阅读答案后,我意识到%
不会进入小数,因此对于 1 % 500 它将返回整数作为余数。如果你仔细想想,这是真的。
%
是一个返回除法余数的multiplicative operator,它不符合模 运算的规则,请参阅this answer。跨度>
【参考方案1】:
(此解释仅适用于正数,否则取决于语言)
定义
模数是一个数除以另一个数的余数。 %
被称为模运算。
例如,9
除以4
等于2
,但仍为1
。在这里,9 / 4 = 2
和 9 % 4 = 1
。
在您的示例中:5 除以 7 得到 0,但仍为 5 (5 % 7 == 5
)。
计算
可以使用以下等式计算模运算:
a % b = a - floor(a / b) * b
floor(a / b)
表示您可以将a
除以b
的次数
floor(a / b) * b
是完全成功分享的金额
总数 (a
) 减去共享的内容等于除法的余数
应用于最后一个例子,得到:
5 % 7 = 5 - floor(5 / 7) * 7 = 5
模数运算
也就是说,你的直觉是它可能是 -2 而不是 5。实际上,在模算术中,-2 = 5 (mod 7)
因为它存在于 Z 中的 k 使得 7k - 2 = 5
。
您可能没有学过模运算,但您可能使用过角度并且知道 -90° 与 270° 相同,因为它是模 360。它是相似的,它环绕!所以画一个圆,说它的周长是 7。然后你读到哪里是 5。如果你尝试用 10,它应该是 3,因为10 % 7
是 3。
【讨论】:
谢谢,这正是我正在寻找的答案 很好的解释 - +1!但是以这种方式切比萨饼 -1k ;) 酷,但是%
不做模运算,它做一个简单的余数所以应该被称为 remainder operator。
@RobG 实际上取决于语言。
@RobG 例如在 Lua 中,% 是一个 mod,而在 C 中,% 是一个 rem。来源:en.wikipedia.org/wiki/Modulo_operation#In_programming_languages【参考方案2】:
如你所说,% 符号用于取模(除法余数)。
在w3schools' javascript Arithmetic page 中,我们可以在剩余部分阅读我认为很好的解释
在算术中,两个整数相除产生一个商和一个 剩余。
在数学中,模运算的结果是 余数算术除法。
因此,在您的具体情况下,当您尝试将 7 根香蕉分成 5 根香蕉的一组时,您可以创建 1 组 5 根(商),剩下的 2 根香蕉(余数)。
如果将 5 根香蕉分成 7 根一组,您将无法这样做,因此您将再次剩下 5 根香蕉(剩余的)。
【讨论】:
【参考方案3】:两步解决方案。
这里的一些答案对我来说很复杂。我将尝试再添加一个答案,以简化查看此问题的方式。
简答:
示例 1:
7 % 5 = 2
每个人都应该得到一片披萨。
将 7 片分成 5 个人,5
的每一个人将得到一份披萨片,我们最终将得到 2
片(剩余)。 7 % 5
等于 2
是因为 7
大于 5
。
示例 2:
5 % 7 = 5
每个人都应该得到一份披萨片
它给出5
,因为5
小于 7
。因此,根据定义,你不能将整个 5
items 与 7
人分开。因此,根本不会进行除法,并且您最终会得到与开始时相同的数量,即 5
。
程序化回答:
过程基本上是问两个问题:
示例 A:(7 % 5)
(Q.1)5 乘以什么数才能得到 7?
Two Conditions: Multiplier starts from `0`. Output result should not exceed `7`.
让我们试试吧:
乘数为零 0
所以,0 x 5 = 0
不过,我们很短,所以我们将乘数加一 (+1)。
1
所以,1 x 5 = 5
我们还没有得到 7,所以我们加了一个 (+1)。
2
所以,2 x 5 = 10
现在我们超过了7
。所以2
不是正确的乘数。
让我们返回一步(我们使用1
)并记住结果是5
。号码5
是这里的关键。
(Q.2)我们需要在5
(我们刚刚从步骤 1 中得到的数字)中添加多少才能获得7
?
我们减去这两个数字:7-5 = 2
。
所以7 % 5
的答案是2
;
示例 B:(5 % 7)
1- 我们用什么数乘以 7 得到 5?
Two Conditions: Multiplier starts from `0`. Output result and should not exceed `5`.
让我们试试吧:
0
所以,0 x 7 = 0
我们还没有得到 5,让我们试试更大的数字。
1
所以,1 x 7 = 7
哦不,我们超过了5
,让我们回到上一步使用0
得到结果0
。
2- 我们需要向0
(我们刚刚从步骤 1 中获得的数字)添加多少才能达到左侧数字5
的值? p>
很明显数字是5。5-0 = 5
5 % 7 = 5
希望对您有所帮助。
【讨论】:
【参考方案4】:下面给出了一种找出余数的新方法
声明:余数总是不变的
ex : 26 divided by 7 gives R : 5
这可以很容易地通过找到完全除以 26 的数字来找到,该数字更接近 除数并取两者之差
13 是 7 之后完全除以 26 的下一个数字,因为在 7 之后是 8、9、10、11、12,其中没有一个完全除以 26,余数为 0。
所以 13 是最接近 7 的数字,除以得到余数 0。
现在取差值 (13 ~ 7) = 5,即 tmainder。
注意:为此,除数应简化为最简单的形式,例如:如果 14 是除数,则必须选择 7 以找到最接近的除数。
【讨论】:
余数不变有什么令人惊讶的?(13 ~ 7) = 5
是什么意思? 13 和 7 之间的差异是 6,而不是 5。“如果 14 是除数,则必须选择 7”是什么意思?答案没有意义,也不会产生正确的结果。【参考方案5】:
第 1 步:5/7 = 0.71
第 2 步:取小数点的左边,所以我们从 0.71 中取 0 并乘以 7 0*7 = 0;
步骤 # : 5-0 = 5 ;因此,5%7 =5
【讨论】:
最后你应该写:“因此 5%7 = 5”【参考方案6】:这只是剩余部分。让我告诉你怎么做
10 % 5=0
9 % 5=4 (because the remainder of 9 when divided by 5 is 4)
8 % 5=3
7 % 5=2
6 % 5=1
5 % 5=0 (because it is fully divisible by 5)
现在我们应该记住一件事,mod 意味着余数所以
4 % 5=4
但为什么是 4? 因为 5 X 0 = 0 所以 0 是小于 4 的最接近的倍数 因此 4-0=4
【讨论】:
【参考方案7】:让我们这样说: 实际上 Modulus operator 执行相同的除法,但它不关心答案,它确实关心提醒,例如,如果您将 7 划分为 5, 那么,让我带你看一个简单的例子: 认为 5 是一个块,那么例如我们将在 15 (WITH Nothing Left) 中有 3 个块,但是当登录到这种数字 1,3,5,7,9, 11,... ,这是模数出现的地方,所以采用我之前所说的逻辑并将其应用于 7 ,所以答案将是我们在 7 中有 1 个 5 => 2 提醒在我们的手!那是模数!!! 但你问的是 5% 7 ,对吧? 所以按照我说的逻辑,我们有多少个 7 块 5 ???? 0 所以模数返回 0... 就是这样……
【讨论】:
【参考方案8】:正如其他人指出的那样,模数是基于余数系统的。
我认为考虑模数的一种更简单的方法是在被除数(要被除的数字)完全除以除数之后剩下的内容。所以如果我们考虑 5%7,当你将 5 除以 7 时,7 只能变成 0 次,当你从 5 中减去 0 (7*0) 时(就像我们在小学学到的那样),那么余数将是 5(mod)。请参见下图。
0
______
7) 5
__-0____
5
使用相同的逻辑,-5 mod 7 将是 -5(只有 0 个 7 可以进入 -5 和 -5-0*7 = -5)。同理,-5 mod -7 也将是 -5。 还有几个有趣的案例:
5 mod (-3) = 2 即 5 - (-3*-1)
(-5) mod (-3) = -2 即 -5 - (-3*1) = -5+3
【讨论】:
【参考方案9】:模数是余数系统。
所以 7 % 5 = 2。
5 % 7 = 5
3 % 7 = 3
2 % 7 = 2
1 % 7 = 1
在函数内部使用时确定数组索引。编程安全吗?那是一个不同的问题。我猜。
【讨论】:
【参考方案10】:模数运算符为您提供“减少残留系统”的结果。例如对于 mod 5 有 5 个整数:0,1,2,3,4。事实上19=12=5=-2=-9 (mod 7)。答案的主要区别是编程语言通过“减少残基系统”给出的。
【讨论】:
以上是关于了解模运算符 %的主要内容,如果未能解决你的问题,请参考以下文章