📜  带有负结果的编程中的模运算(1)

📅  最后修改于: 2023-12-03 14:54:06.589000             🧑  作者: Mango

带有负结果的编程中的模运算

当进行数学运算时,我们经常需要使用取模运算(也称为余数运算),即将一个数除以另一个数并返回余数。例如,10除以3的余数为1,记作10 mod 3 = 1。

在编程中,我们可以使用%运算符来进行模运算。但是,当涉及到带有负数的运算时,取模运算的结果可能会出现一些奇怪的情况。在本文中,我们将介绍带有负结果的编程中的模运算,并讨论如何正确地处理它们。

取模运算

在大多数编程语言中,取模运算使用%运算符。例如,在Python中:

>>> 10 % 3
1

这个例子演示了10除以3的余数,结果为1。

带有正数的取模运算

当使用正数进行取模运算时,结果与数学中的预期相同。例如,在Python中:

>>> 7 % 3
1

这个例子演示了7除以3的余数,结果为1。

带有负数的取模运算

当使用负数进行取模运算时,结果可能会与数学中的预期不同。考虑以下例子:

>>> -7 % 3
2

这个例子演示了-7除以3的余数,结果为2。这是因为如果我们将-7除以3,我们可以得到-2余1。然而,Python返回的结果是2。这是因为Python和大多数其他编程语言使用称为“截断向零”的规则处理负数的模运算:

  • 如果操作数都是正数,那么结果与数学中的预期相同。
  • 如果左操作数为负,那么结果将在0和右操作数之间(不包括0)。
  • 如果右操作数为负,那么结果将在左操作数和0之间(不包括0)。

当左操作数为负时,我们将其转换为正操作数。我们找到最接近它的正操作数的n倍的数,最接近n倍的数并且小于等于左操作数的数就是我们的答案。

根据这个规则,我们可以手动计算-7 mod 3为2:

-7 = -2 * 3 + 1

重要的是要注意左操作数的符号如何影响结果。例如,在Python中:

>>> 7 % -3
-2

这个例子演示了7除以-3的余数,结果为-2。

解决方法

如果我们希望在负数取模运算时得到与数学中的预期一样的结果,则可以使用所谓的“修正Euclidean模运算”。这种方法在Java和其他一些语言中也称为“floor模运算”。它包括以下三个步骤:

  1. 使用常规模运算计算余数。
  2. 如果结果为负数,则加上模数的值,以获得最终结果的正值。
  3. 如果结果大于或等于模数,则减去模数,直到结果小于模数为止,以获得最终结果的取模值。

以下是使用修正欧几里得模运算和-7 mod 3的Python例子:

>>> (-7) % 3
2
>>> (-7) % -3
-1
>>> 7 % (-3)
-2
>>> 7 % 3
1
 
def floor_mod(n, m):
    return (n % m + m) % m
 
>>> floor_mod(-7, 3)
2
>>> floor_mod(-7, -3)
2
>>> floor_mod(7, -3)
1
>>> floor_mod(7, 3)
1
结论

在编写带有负结果的代码时,要注意处理模运算,以确保得到正确的结果。如果需要,在编写代码时可以使用修正欧几里得模运算。