轉自:https://www.cnblogs.com/widerg/p/7208041.html
真正說清了負數取餘的一篇好文!!!
C++負數取模
預習:
r=餘數
a=被除數
b=除數
c=商
a/b=c........r
r=a-(a/b)*b
一、下面的題目你能全做對嗎?
1.7/4=?
2.7/(-4)=?
3.7%4=?
4.7%(-4)=?
5.(-7)/4=?
6.(-7)%4=?
7.(-7)/(unsigned)4=?
答案:
1
-1
3
3
-1
-3
1073741822
如過你全部答對,你可以無視後面的內容……
二、除法的取整分類
除法的取整分爲三類:向上取整、向下取整、向零取整。
1.向上取整:向+∞方向取最接近精確值的整數。
在這種取整方式下,7/4=2,7/(-4)=-1,6/3=2,6/(-3)=-2
2.向下取整:向-∞方向取最接近精確值的整數。
在這種取整方式下,7/4=1,7/(-4)=-2,6/3=2,6/(-3)=-2
3.向零取整:向0方向取最接近精確值的整數,換言之就是捨去小數部分,因此又稱截斷取整。
在這種取整方式下,7/4=1,7/(-4)=-1,6/3=2,6/(-3)=-2
通過觀察可以發現,無論是向上取整還是向下取整,(-a)/b==-(a/b)都不一定成立。
這給程序設計者帶來了極大的麻煩。
而對於向零取整,(-a)/b==-(a/b)是成立的,以此,C/C++採用這種取整方式。
三、負數取模
回想小學的公式:被除數÷除數=商……餘數。
由此可知,餘數=被除數-商×除數 (*)
對C/C++而言,(*)式依然成立。並且,該式是解決負數取模問題的關鍵。
例一:7%(-4)=?
解:由C/C++向零取整的整除方式可知,7/(-4)=-1;
由(*)式知,餘數=7-(-4)*(-1)=3.所以,7%(-4)=3
例二:(-7)%4=?
解:由C/C++向零取整的整除方式可知,(-7)/4=-1;
由(*)式知,餘數=(-7)-4*(-1)=-3.所以,(-7)%4=-3
例三:(-7)%(-4)=?
解:由C/C++向零取整的整除方式可知,(-7)/(-4)=1;
由(*)式知,餘數=(-7)-(-4)*1=-3.所以,(-7)%(-4)=-3