了解模运算符%

Understanding The Modulus Operator %

我通过以下表达式理解Modulus运算符:

1
7 % 5

这将返回2,这是因为5一次进入7,然后给出剩下的2,但是当您将以下语句反转为以下内容时,我会感到困惑:

1
5 % 7

这给了我5的值,这使我有些困惑。 尽管7的总数没有变成5,所以为什么没有7的余数或正数或负数的余数呢?

如果它基于7完全不等于5的事实来计算5的值,那么为什么余数不是7而不是5?

我对模运算符的理解似乎缺少一些东西。


(此说明仅适用于正数,因为它取决于语言。)

定义

模量是欧几里德除以一个数与另一个的余数。 %称为模运算。

例如,9除以4等于2,但仍为1。在这里,9 / 4 = 29 % 4 = 1

Euclidean Division

在您的示例中:5除以7得到0,但仍为5(5 % 7 == 5)。

计算方式

模运算可以使用以下公式计算:

1
a % b = a - floor(a / b) * b
  • floor(a / b)表示可以将a除以b的次数
  • floor(a / b) * b是完全成功共享的金额
  • 总(a)减去共享的部分等于除法的其余部分

应用于最后一个示例,得出:

1
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。


两步解决方案。

对于我来说,这里的一些答案很复杂。我将尝试再添加一个答案,以简化查看方式。

简短答案:

Each person should get one.

7 % 5给出2是因为7大于5。因此,每个5人都得到一个,而您最终得到其余的2

Each person should get one.

5 % 7给出5,因为5小于7。因此,根据定义,您不能在7个人上划分整个5个项目。因此,除法不会发生,您最终得到的起始金额为5

程序化答案:

这个过程基本上是问两个问题:

范例A:(7%5)

(Q.1)乘以5得到7的数字是多少?

1
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是此处的关键。

(问题2)要获得7,我们需要添加多少到5(我们从步骤1中获得的数字)?

我们减去两个数字:7-5 = 2

因此,7 % 5的答案是2;

范例B:(5%7)

1-我们要乘以7以获得5的数字是多少?

1
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-为了达到左侧5左边数字的值,我们需要加多少到0(我们刚从步骤1得到的数字)?

显然数字是5。5-0 = 5

1
   5 % 7 = 5

希望能有所帮助。


正如其他人指出的那样,模量基于剩余系统。

我认为考虑模数的更简单方法是将除数(要除的数)除以除数后剩下的数。因此,如果我们考虑5%7,当您将5除以7时,7只能变成0到5,而当您从5中减去0(7 * 0)时(就像我们在小学学习的一样),那么其余的将是5(国防部)。请参见下图。

1
2
3
4
5
   0
  ______
7) 5    
__-0____
   5

使用相同的逻辑,-5 mod 7将为-5(-5中只能输入0 7,而-5-0 * 7 = -5)。具有相同标记的-5 mod -7也将为-5。
还有一些有趣的情况:

5 mod(-3)= 2,即5-(-3 * -1)

(-5)mod(-3)= -2,即-5-(-3 * 1)= -5 + 3


模数为余数系统。

所以7%5 = 2。

5%7 = 5

3%7 = 3

2%7 = 2

1%7 = 1

在函数内部使用以确定数组索引时。编程安全吗?那是一个不同的问题。我猜。


剩下的就差不多了。让我告诉你怎么做

1
2
3
4
5
6
7
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意味着余数,所以

1
4 % 5=4

但是为什么是4?
因为5 X 0 = 0
所以0是小于4的最接近倍数
因此4-0 = 4


步骤1:5/7 = 0.71

第2步:取小数点的左侧,因此我们从0.71取0并乘以7
0 * 7 = 0;

步骤#:5-0 = 5;因此,5%7 = 5


下面给出了一种发现余数的新颖方法

声明:余数始终不变

1
ex : 26 divided by 7 gives R : 5

通过找到完全除以26的数字,可以很容易地发现这一点。
除数并取两者之差

1
2
3
4
5
6
7
8
13 is the next number after 7 that completely divides 26 because after 7 comes 8, 9 ,

10, 11, 12 where none of them divides 26 completely and give remainder 0.
So 13 is the closest number to 7 which divides to give Remainder 0.
now take the difference (13 ~ 7) = 5 which is the Remainder .

note : for this to work divisor should be reduced to its simplest form ex: if 14
is the divisor ..7 has to be chosen to find the closest number dividing the dividend.

可汗学院有一个很好的描述:
https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/what-is-modular-arithmetic


让我们这样写:
实际上,Modulus运算符会进行相同的除法运算,但它并不关心答案,例如,如果您将7除以5,它会注意提示。
因此,让我为您介绍一个简单的示例:
认为5是一个块,那么例如我们将在15中有3个块(WITH Nothing Left),但是当loginc进入这种类型时,数字{1,3,5,7,9,11,...},这就是Modulus出现的地方,因此请采用我之前说的逻辑并将其应用于7,这样的答案将是我们手中有1块5等于7 =>且有2个提示!那就是模量!!!
但是您要问的是5%7,对吗?

所以按照我说的逻辑,我们在5中有多少个7块? 0
所以模数返回0 ...
而已 ...


模量运算符为您提供"减少残留物系统"的结果。例如对于mod 5,有5个整数计数:0、1、2、3、4。实际上19 = 12 = 5 = -2 = -9(mod 7)。答案是由编程语言通过"减少残留物系统"给出的主要区别。