/
...
/
/
🤔
C++ Negative Number取余问题
Search
Try Notion
🤔🤔
C++ Negative Number取余问题
一.引入
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
Copy
C++
如过你全部答对,你可以无视后面的内容……
二.除法的取整分类
除法的取整分为三类:向上取整、向下取整、向零取整。
向上取整:向+∞方向取最接近精确值的整数。在这种取整方式下,7/4=2,7/(4)=1,6/3=2,6/(3)=27/4=2,7/(-4)=-1,6/3=2,6/(-3)=-2
向下取整:向-∞方向取最接近精确值的整数。在这种取整方式下,7/4=1,7/(4)=2,6/3=2,6/(3)=27/4=1,7/(-4)=-2,6/3=2,6/(-3)=-2
向零取整:向0方向取最接近精确值的整数,换言之就是舍去小数部分,因此又称截断取整。在这种取整方式下,7/4=1,7/(4)=1,6/3=2,6/(3)=27/4=1,7/(-4)=-1,6/3=2,6/(-3)=-2
通过观察可以发现,无论是向上取整还是向下取整,(a)/b=(a/b)(-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