取模算法:
取模運算也叫取餘運算,在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
綜上所述可以得出結論:被除數如果是負數