理解取模运算符%

102

我理解取模运算符的含义,可以用以下表达式表示:

7 % 5

由于5除7余2,因此这将返回2,但当您将此语句反转为以下内容时,我感到困惑:

5 % 7

这给了我值为5,让我有点困惑。虽然整个7不能被5整除,但部分可以,那么为什么没有余数或正负2的余数?

如果它是基于7根本无法整除5来计算5的值,那么余数为什么不是7而是5呢?

我觉得我在理解模运算方面漏掉了什么。


13
模数是“绝对值”的意思。你说的应该是“模运算”,它与余数有关。这两个词非常相似,这让很多人感到困惑,真是遗憾。 - Discordanian
我在小数和负数方面遇到了问题,并在这里找到了答案:https://stackoverflow.com/questions/48662225/understanding-something-more-about-the-modulo-modulus-and-modulo-modulus-w - B. Dionys
1
这是余数运算符,而不是“模运算符”。 - user207421
让我感到困惑的是 1 % 500 返回了 1,但如果你手动进行长除法,1 将完全进入 500 而没有任何余数(但它将是一个小数结果)。阅读答案后,我意识到 % 不会产生小数,因此对于 1 % 500,它将返回整数作为余数。如果你仔细想想,这是正确的。 - Ali
% 是一个乘法运算符,它返回除法的余数,它不符合模运算的规则,请参见此答案 - RobG
10个回答

198

(这个解释仅适用于正数,因为它取决于语言)

定义

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

例如,9 除以 4 等于 21。 这里,9 / 4 = 2 9 % 4 = 1

Euclidean Division

在您的示例中: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)因为存在一个k在Z中使得7k - 2 = 5

也许你没有学过模运算,但你可能使用过角度并知道-90°与270°相同,因为它对360取模。它类似于“环绕”!所以拿一个圆圈,说它的周长是7。然后你看一下5在哪里。如果你试着用10,那么应该是3,因为10 % 7是3。


谢谢,这正是我在寻找的答案类型。 - Nader Belal
7
非常好的解释,加一分!但是这样切披萨扣掉一千个赞(原文中的"k"指代“千”)。 - user3249027
2
很酷,但是“%”不执行模运算,它只是简单的余数,因此应该称为余数运算符 - RobG
1
@RobG 这实际上取决于编程语言。 - Maxime Chéramy
1
例如在Lua中,%是模运算符,在C中,%是余数运算符。来源:https://en.wikipedia.org/wiki/Modulo_operation#In_programming_languages - Maxime Chéramy

29

两步解决方案

这里的一些答案对我来说太复杂了。我会尝试添加一个答案,试图简化如何看待这个问题的方式。


简短回答:

示例1:

7 % 5 = 2

每个人应该得到一片比萨饼。

将7份比萨切成5份,每个人就可以分到一片比萨,我们最后剩下2片比萨。因为75大,所以7%5等于2.


示例2:

5 % 7 = 5

每个人应该得到一片比萨饼。

结果为5是因为57小。因此根据定义,你无法将整个5份物品分给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 的值?

很明显这个数字是5。5-0 = 5

   5 % 7 = 5

希望有所帮助。


10

正如其他人指出的一样,模数是基于余数系统的。

我认为更简单的理解模数的方法是,在除数完全除掉被除数(即要被除的数字)后所剩余的部分。因此,如果我们考虑5%7,当你用7去除5时,7只能够整除0次,而当你从5中减去0(7*0),就像我们在小学学习的那样,剩下的余数就是5(即模数)。请参见下面的示例。

   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


8

这只是关于余数的问题。让我向您展示如何操作。

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


3

步骤1:5/7 = 0.71

步骤2:取小数点左边的数字,因此我们从0.71中取出0并乘以7 0*7 = 0;

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


1
因此,5%7 = 5。 - Johnny

2

模数是余数系统。

因此7 % 5 = 2。

5 % 7 = 5

3 % 7 = 3

2 % 7 = 2

1 % 7 = 1

在函数中使用它来确定数组索引。这是安全的编程吗?那是另一个问题。我猜。


0
下面介绍了一种新颖的找出余数的方法。
语句:余数始终保持不变。
ex : 26 divided by 7 gives R : 5 

可以通过找到最接近除数的完全除数并计算两者之差来轻松找到这个数字。

在7之后,13是下一个完全除26的数字,因为在7之后是8、9、10、11、12,它们都不能完全除以26并给出余数0。

因此,13是最接近7的可整除26的数字。

现在取差值(13〜7)= 5,这就是余数。

注意:为了使其有效,除数应简化为最简形式,例如:如果除数为14,则必须选择7来找到最接近被除数的数字。


余数保持不变有什么惊人之处?(13 ~ 7) = 5是什么意思?13和7的差是6,而不是5。如果除数是14,则必须选择7是什么意思?答案毫无意义,并且不能得出正确的结果。 - user207421

0

模数运算符会给出“约简剩余系”中的结果。例如,对于模5,有5个整数:0、1、2、3、4。实际上,19=12=5=-2=-9 (mod 7)。主要区别在于编程语言通过“约简剩余系”来给出答案。


0
让我们这样说:
实际上模运算符进行相同的除法,但它不关心答案,而是关心余数。例如,如果你将7除以5,
所以,让我通过一个简单的例子来带你理解:
想象5是一个块,那么例如在15中我们会有3个块(没有剩余),但当这种逻辑应用于这种数字{1,3,5,7,9,11,...}时,这就是模运算符的作用,所以采用我之前说过的逻辑并将其应用于7,答案将是我们手中有1个5块=>还剩2个!这就是模数!!!
但你问的是5%7,对吧?
所以采用我说的逻辑,我们有多少个7块可以放入5中?0
因此,模数返回0...
就是这样...


0

正如你所说,百分号(%)用于取模(除法余数)。

w3schools的JavaScript算术页面中,我们可以在余数部分阅读到我认为是一个很好的解释:

在算术中,两个整数的除法产生一个和一个余数

在数学中,模运算的结果是算术除法的余数

因此,在您特定的情况下,当您尝试将7个香蕉分成5个一组时,您能够创建1组5个(商),并且您将剩下2个香蕉(余数)。

如果将5个香蕉分成7个一组,则无法这样做,因此您仍然剩下5个香蕉(余数)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接