取模與取余,取模取余
對於整型數a,b來說,取模運算或者求余運算的方法都是:
1.求整數商: c = a/b;
2.計算模或者余數: r = a - c*b.
求模運算和求余運算在第一步不同: 取余運算在取c的值時,向0 方向捨入(fix()函數);而取模運算在計算c的值時,向負無窮方向捨入(floor()函數)。
例如:計算-8 % 3
那麼:a = -8;b = 3;
第一步:求整數商c,(float)c = a/b = -2.67 ,如進行求模運算c = -3(向負無窮方向捨入),求余c = -2(向0方向捨入);
第二步:計算模和余數的公式相同,但因c的值不同,求模時r = 1,求余時r = -2。
歸納:當a和b符號一致時,求模運算和求余運算所得的c的值一致,因此結果一致。
當符號不一致時,結果不一樣。求模運算結果的符號和b一致,求余運算結果的符號和a一致。
各個環境下%運算符的含義不同,比如c/c++,java 為取余,而python則為取模,就數學上而言,兩種都是正確的。
很多語言干脆提出兩個函數,取余rem和取模mod。
事實上,a mod b = floor((float)c) = floor(a/b) = floor(-2.67) = -3 ; a rem b = a mod b + 1;floor表示向下取整,對應的,rem也可用fix實現。