所謂取模運算,就是計算兩個數相除之后的余數,符號是%。如a % b就是計算a除以b的余數。用數學語言來描述,就是如果存在整數n和m,其中0 <= m < b,使得$ a = n * b + m $,那么$ a \% b = a - n * b = m $。
先測試幾個例子:
print(9%5) # 4
print(-9%5) # 1
print(9%-5) # -1
print(-9%-5) # -4
可以看到,數值部分雖然相同,但是正負符號的四種不同組合,會產生完全不同的四種結果。那么這里面有什么規律嗎?
實際上,雖然結果不一樣,不過取模運算完全遵從統一的規則:
其中$\lfloor\frac{a}{b}\rfloor$表示a除以b的結果向下取整。
比如$9\%5$,先計算$\lfloor\frac{9}{5}\rfloor$,向下取整得到1,然后計算$9-1*5$,得到4;
同理$-9\%5$,先計算$\lfloor\frac{-9}{5}\rfloor$,向下取整得到-2,然后計算$-9-(-2*5)$,得到1;
再來看$9\%-5$:
最后是$-9\%-5$:
雖然知道結果是如何計算出來的,不過人腦不比電腦,這樣計算未免太復雜,為避免給大腦增加負擔,再根據上面的規則,這里我總結了一個簡單的記憶方法:
對于不帶負號的,2個數字都是正數的,直接求結果,這個應該來說是比較簡單的,而且無論符號是什么,我們都只計算這個值;
對于有負號的,不管負號在哪個數字,都去除負號,然后計算步驟1的結果;
接下來根據負號的位置分為3種情況,假設除數是K,去掉負號后取模的結果是M:2個數都是負數,直接等于-M
被除數是負數,除數是正數,由于是向下舍入,最后相當于會多加上一個K,也就是說模一定是大于0的,結果是K-M
被除數是正數,除數是負數,剛好相反,結果是M-K,注意這里的K是除數的絕對值,是正數
簡單歸納:
不管有沒有負數,先按正數求模得到M
2個數都為負數,結果是-M
只有1個數為負數,負數在上,記住結果一定是正的,大數-小數(除數-余數),那么就是K-M
只有1個數為負數,負數在下,記住結果一定是負的,小數-大數(余數-除數),那么就是M-K
注:此規律的前提是除的結果一定是向下取整,如果你用java去套這個規律會發現完全行不通。