了解模运算符%


70

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

7 % 5

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

5 % 7

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

如果它基于7根本不变成5的事实来计算5的值,那么为什么余数不是7而不是5?

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


6
模量是“绝对值”。您指的是与余数有关的“模”。可惜的是,这些单词如此相似,以至于让很多人感到震惊。
Discordanian 2015年

我曾与小数和负数的问题,在这里找到我的答案:stackoverflow.com/questions/48662225/...
B. Dionys

它是余数运算符。不是“模运算符”。
user207421'5

1 % 500返回的结果让我感到困惑,1但是如果您手动进行长除法,则1将完全变成500,而没有任何余数(但这将是一个十进制结果)。阅读答案后,我意识到它%不会用小数位表示,因此对于1%500,它将返回整数作为余数。如果您考虑一下,那是对的。
点击Upvote '20

%是一个乘法运算符,它返回除法的余数,它不符合取运算的规则,请参见此答案
RobG '20

Answers:


134

(此说明仅针对正数,因为否则取决于语言)

定义

是由另外一个号码的欧几里得除法的余数。%称为模运算

例如,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)代表你可以把次数ab
  • 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。


谢谢,这就是我要寻找的答案的类型
Nader Belal

2
很好的解释-+1!但是-1k用这种方式切比萨饼;)
user3249027

很酷,但是%不做模运算,它做一个简单的余数,所以应该称为余数运算符
RobG

@RobG实际上取决于语言。
MaximeChéramy20年

@RobG例如在Lua中,%是mod,在C中,%是rem。来源:en.wikipedia.org/wiki/Modulo_operation#In_programming_languages
MaximeChéramy20年

18

两步解决方案。

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


简短答案:

范例1:

7 % 5 = 2

每个人都应该得到一份披萨片。

将7片切成5人,每个5人将得到一份披萨片,最后得到2(剩下的)片。7 % 5等于是2因为7 大于 5


范例2:

5 % 7 = 5

每个人都应该得到一份披萨片

它给出的5是因为5 小于 7。因此,根据定义,您不能将整个5项目划分7人员。因此,除法运算根本不会发生,您最终得到的金额与开始时的金额相同5


程序化答案:

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

范例A:(7%5)

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

Two Conditions: Multiplier starts from `0`. Output result should not exceed `7`. 

我们试试吧:

乘数为零00 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 % 52;


范例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,当您将5除以7时,7只能变成0到5,而当您从5中减去0(7 * 0)时(就像我们在小学学习的一样),那么其余的将是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


5

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

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


2

模数为余数系统。

所以7%5 = 2。

5%7 = 5

3%7 = 3

2%7 = 2

1%7 = 1

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


2

步骤1:5/7 = 0.71

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

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


1
最后,您应该输入:“因此5%7 = 5”
Johnny

0

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


0

让我们这样说:
实际上Modulus运算符会做同样的除法运算,但它不在乎答案,例如,如果将7除以5,它会引起注意,
所以,让我来看 一个简单的例子:
思考5是一个块,例如,我们将在15个中有3个块(WITH Nothing Left),但是当loginc进入这种类型时,数字{1,3,5,7,9,11,...}就是取模量出来的位置,因此采用我之前说的逻辑并将其应用于7,这样的答案将是我们手中有1块5等于7 =>且有2个提示!那就是模量!!!
但是您要问的是5%7,对吗?
所以按照我说的逻辑,我们在5中有多少个7块?0
所以模数返回0 ...
就这样...


0

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

声明:余数始终不变

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,这是篡改因子。

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


那么剩余的常数是什么呢?什么(13 ~ 7) = 5意思 13和7之间的差是6,而不是5。“如果14是除数,则必须选择7”是什么意思?回答毫无意义,也不会得出正确的结果。
user207421 '20

0

如您所说,%符号用于取模数(除法余数)。

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

在算术中,将两个整数相除会得到余数

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

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

如果将5根香蕉分成7组,您将无能为力,因此又剩下5根香蕉(剩余)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.