取模算法:
取模运算也叫取余运算,在C中用%来表示, 数学中叫mod。
x mod y = x%y
x%y = x - y[x/y], for y!=0.
数学中的余数概念和我们的计算机中的余数概念一致,但实现却不一致。
其中 [x/y] 代表的是 x/y 的最小下界。
例:
-3 mod 2 = -3 - 2*[-3/2]
= -3 - 2*[-1.5]
= -3 - 2*(-2)
= -3 + 4
= 1
而我们的计算机是怎么做的呢:
-3%2 = -3 - 2*(-3/2)
= -3 - 2*(-1)
= -3 - (-2)
= -1
所以计算机中的取余实际上是:
x%y = x - y(x/y), for y!=0.
这就是二者的区别。这个区别,对于正数,二者计算出的结果是相等的,但是负数就不相等了。这就意味着,如果以后在使用数学中余数相关定理的时候, 要注意计算机中余数的计算和数学定义不是完全一致的,所以在计算机上,对于负数,数学定理并不完全适用。当然,对于正数,二者是没有区别的。至于为什么计算机上要这么实现,我想恐怕还是历史原因,最早的计算机如果这样计算除法(取余是靠除法来完成的),那么就涉及到浮点数的计算以及取下界,这样,将比较大的降低效率,所以实现成了这样的方式,一直沿用至今。
取余(取模)的奥义
“/”在我们这些程序中代表整除,它符合除法法则,异号抵消。
再看看我们余数的定义:
整除“余”下的“数”。
则有:余数=被除数-商除数
商就是我们整除的结果。
看例子:
eg1:
(-6%5) = -6 - (-6/5)5
(-6%5) = -6 - (-1)5
(-6%5) = -6 - (-5)
(-6%5) = -6+5
(-6%5) = -1
eg2:
(5%-6) = 5 - (5/-6)(-6)
(5%-6) = 5 - (0)(-6)
(5%-6) = 5 - 0
(5%-6) = 5
eg3:
(-5%-6)= -5 - (-5/-6)(-6)
(-5%-6)= -5 - (0)(-6)
(-5%-6)= -5 - 0
(-5%-6)= -5
eg4:
(6%-5) = 6 - (6/-5)(-5)
(6%-5) = 6 - (-1)*(-5)
(6%-5) = 6 - 5
(6%-5) = 1
综上所述可以得出结论:被除数如果是负数