Python 与 C++ 关于负数取模的不同

对于被除数 $a$ 和除数 $n$,若有 $a=nq+r,\ q\in\mathbb{Z},\ |r|<|q|$

则余数 $r=a-nq$

不同的编程语言对于商 $q$ 的求法不同

C++

大多数编程语言中都使用截断除法,即商向 0 取整 $q=\operatorname{trunc}\left(\frac{a}{n}\right)$。因此,余数和被除数符号一致

$r=a-n \operatorname{trunc}\left(\frac{a}{n}\right)$

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;


int main() {
cout << -6 % 5 << endl; // q=-1, r=-1
cout << -2 % 5 << endl; // q=0, r=-2
cout << 2 % -5 << endl; // q=0, r=2
cout << 6 % -5 << endl; // q=-1, r=1
cout << -6 % -5 << endl; // q=1, r=-1

return 0;
}

Python

在 Python 中,商向下取整 $q=\left\lfloor\frac{a}{n}\right\rfloor$。因此,余数和除数符号一致

$r=a-n \left\lfloor\frac{a}{n}\right\rfloor$

例:

1
2
3
4
5
print(-6 % 5)  # q=-2, r=4
print(-2 % 5) # q=-1, r=3
print(2 % -5) # q=-1, r=-3
print(6 % -5) # q=-2, r=-4
print(-6 % -5) # q=1, r=-1

参考

https://zh.wikipedia.org/wiki/%E6%A8%A1%E9%99%A4