1. 程式人生 > >取模和取餘

取模和取餘

取模和取餘
通常情況下,取模運算(MOD)和取餘運算(REM)被混為一談,因為在大多數的程式語言裡,都用" % " 符號來表示取模運算或者取餘運算。所以有必要編寫本文件,來為在此環節遇到問題的程式設計師理清思路,同時也提醒各位需要注意在不同程式語言環境下" % " 運算子的具體意義,因為在有負數存在的情況下,兩者的結果是不一樣的。

首先,我們需要區分兩者的概念。
取模(MOD):
給定一個正整數p,任意一個整數n,一定存在等式 :
n = k * p + r ;
其中 k、r 是整數,且 0 ≤ r < p,則稱 k 為 n 除以 p 的商,r 為 n 除以 p 的餘數。
對於正整數 p 和整數 a, b,定義如下運算:
取模運算:a % p(或a mod p),其結果表示a除以p的餘數。
模p加法: 其結果是a + b算術和除以p的餘數。
模p減法: 其結果是a - b算術差除以p的餘數。
模p乘法: 其結果是 a * b算術乘法除以p的餘數。
取餘(REM):
給定一個正整數p,任意一個整數n,一定存在等式 :
n = k * p + r ;
其中 k、r 是整數,且 0 ≤ r < p,則稱 k 為 n 除以 p 的商,r 為 n 除以 p 的餘數。
取餘運算:是指希望一個較小的數除以另一個較大的數,從而獲得的不夠除的部分就是餘數,就是取餘運算的結果。

接下來,需要說明的是,取模運算(“Modulo Operation”)和取餘運算(“Remainder Operation”)兩者概念雖有重疊的部分但又不完全一致。主要的區別在於對負整數進行除法運算時操作不同。取模運算主要是用於計算機術語中。取餘運算則更多是數學概念。模運算在數論和程式設計中都有著廣泛的應用。
對於整型數a,b來說,取模運算或者取餘運算的方法都是:
1.求 整數商: c = a / b;
2.計算模或者餘數: r = a - c * b.
取模運算和取餘運算在第一步不同: 取餘運算在取c的值時,向0 方向舍入(fix()函式); 取模運算在計算c的值時,向無窮小方向舍入(floor()函式)。
因此,當a和b符號一致時,取模運算和取餘運算所得的c的值一致,因此結果一致。但是當符號不一致的時候,結果不一樣。
具體來說,取模運算結果的符號和b一致,取餘運算結果的符號和a一致。
在C語言中,%符號表示的是取餘運算,在python指令碼中,%表示的是取模。
(通常取模運算中b不允許是負數,但是在python 2.5.1裡可以在%後面跟負數,因為python語言中除法的結果是向0舍入,因此計算結果是取模!)

Example:
例如:計算-7Mod 4
那麼:a = -7;b = 4;
第一步:求整數商c,如進行取模運算c = -2(向負無窮方向舍入),取餘c = -1(向0方向舍入);
第二步:計算模和餘數的公式相同( r = a - c * b ),但因c的取值不同,取模時r = 1,取餘時r = -3。

倘若讀者已經瞭解並掌握了兩者的區別,也就能很好的理解:“當我們賦值給一個無符號型別,一個超出它表示範圍的值時,結果是初始值對無符號型別表示數值總數取模後的餘數。”這句話。
例如, 8位元大小的unsignedchar 可以表示0 至 255 區間內的值,如果我麼賦值給此型別變數一個區間以外的值,則實際的結果是該值對256取模後所得的餘數。因此, 把 -1 賦值為8位元大小的unsignedchar 所得的結果是255.