负整数间是怎么整除和取余数的呢?
数学上貌似没定义,但计算机确实能算。于是就试了试,想总结一下规律。
一不小心发现,C/C++ 和 Python 下的结果是不同的:
C/C++ |
Python |
精确值 |
|
---|---|---|---|
-14/3 |
-4 |
-5 |
-4.67 |
-14%3 |
-2 |
1 |
/ |
14/-3 |
-4 |
-5 |
-4.67 |
14%-3 |
2 |
-1 |
/ |
-14/-3 |
4 |
4 |
4.67 |
-14%-3 |
-2 |
-2 |
/ |
总结规律如下:
- 两种语言中,商和余数都符合 被除数=商x除数+余数 这一数学规律。
- 两种语言中,整除的方法不同:C/C++ 是向零取整(负数向上、正数向下取整),Python 是下取整。
以 n/3 和 n%3 为例,看看这两种处理方法的区别。
C 的情况,两种运算结果都关于0对称和反号:
n | -5 | -4 | -3 | -2 | -1 | 0 | +1 | +2 | +3 | +4 | +5 |
商 | -1 | -1 | -1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
余数 | -2 | -1 | 0 | -2 | -1 | 0 | 1 | 2 | 0 | 1 | 2 |
Python 的情况,运算结果是完全连续的:
n | -5 | -4 | -3 | -2 | -1 | 0 | +1 | +2 | +3 | +4 | +5 |
商 | -2 | -2 | -1 | -1 | -1 | 0 | 0 | 0 | 1 | 1 | 1 |
余数 | 1 | 2 | 0 | 1 | 2 | 0 | 1 | 2 | 0 | 1 | 2 |
不知道那种在数学上更好用。个人觉得 Python 的处理方式更优美一些吧。
至于其他语言的处理方法,应该也出不了这两种。我所知道的:
- C/C++ “向零取整式整除”:C/C++、Java、bash
- Python “下取整式整除”:Python、Perl、Lua