代码之家  ›  专栏  ›  技术社区  ›  Federico

python如何计算这个模?[副本]

  •  0
  • Federico  · 技术社区  · 11 年前

    python是如何计算这个模的?

    >>>-1%10  
    9
    
    4 回复  |  直到 11 年前
        1
  •  0
  •   chucksmash    11 年前

    The Wikipedia article on the modulo operation 为提供以下约束 a % q :

    a = nq + r
    

    替换 a = -1 , q = 10 和 r = 9 ,我们看到n必须等于-1。

    插入n的-1:

    -1 % 10  # Python evaluates this as 9
    -1 = n * 10 + r
    -1 = -1 * 10 + r
    9 = r
    

    使用另一个示例进行测试(再次插入-1表示n):

    -7 % 17  # Python evaluates this as 10
    -7 = n * 17 + r
    -7 = -17 + r
    10 = r
    

    具有正分子和负分母的第三个例子:

    7 % -17  # Python evaluates this as -10
    7 = n * (-17) + r
    7 = -1 * (-17) + r
    7 = 17 + r
    -10 = r
    

    似乎当 a 和 q 有不同的迹象,我们从 n = -1 和减量 n 直到我们找到最接近零的n n*q < a 。我们可以通过使用 一 和 q 这样 |a| > |q| :

    -100 % 11  # Python evaluates as 10
    -100 = n * 11 + r
     ...   -1  # -11 > -100
     ...   -2  # -22 > -100
     ...   -3  ...
     ...   -4  ...
     ...   -5  ...
     ...   -6  ...
     ...   -7  ...
     ...   -8  ...
     ...   -9  # -99 > -100
     -100 = -10 * 11 + r  # -110 < -100
     -100 = -110 + r
     10 = r
    

    因此,虽然这可能不是Python实际用来计算模的算法,但我们至少有一个有用的心理模型来推理给定结果是如何得出的。

        2
  •  0
  •   Vineet Kumar Doshi    11 年前

    它是这样计算的:-
    -10 / 10 = -1 ,
    因此剩余部分 9 .
    -10 是的最大倍数 10 小于 -1 .

    类似于 9 % 5 ,将是应考虑的最大数目小于股息。

    5/5 = 1 因此 4 .

        3
  •  0
  •   Vineet Kumar Doshi    11 年前

    我不确定你是在问python使用的算法,还是为什么答案是这样的。

    如果是后者,想象模 n 你减去或加 n 直到你得到一个介于 0 和 n-1 包含全部费用

        4
  •  0
  •   skyking    11 年前

    至少对于python-2.79,首先进行整数除法 x/y 截断为零。那么 x 商乘以 y (即 x - (x/y)*y )计算。如果结果为非零且 y 那么是不同的符号 y 添加到结果中。

    举个例子 x=-1 和 y=10 ,我们首先计算 x年/年 其为0(-0.1至0)。不同之处在于 -1 - 0 这是 -1 现在 -1 为非零,符号与 10 ,因此我们添加 10 去它并得到 9 .

    对于python3(3.4.2),它有点复杂,因为对于python 3,整数实际上是 long 所以 division algorithm 在软件而不是硬件中实现,但在其他方面基本相同。除法是使用标准除法算法进行的无符号除法,对一些合适的数字使用基数2^N N 取决于平台。