了解模运算符 %

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 = 29 % 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。因此,根据定义,你不能将整个 5items 与 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)。答案的主要区别是编程语言通过“减少残基系统”给出的。

【讨论】:

以上是关于了解模运算符 %的主要内容,如果未能解决你的问题,请参考以下文章

模2运算的原理 模2加法,模2减法,模2乘法,模2除法

识别何时使用模运算符

Python笔记-取模运算%

基本运算符与模运算符

嵌入式C中模运算符的替代方案? [关闭]

Java运算符