数学:
如果你有这样一个方程:
x = 3 mod 7
x可以是-4,3,10,17等,更一般地说:
x = 3 + k * 7
其中k可以是任何整数。我不知道是否为数学定义了模运算,但因子环肯定是。
Python:
在Python中,当您使用正数m
和%
时,您将始终获得非负值:
#!/usr/bin/python
# -*- coding: utf-8 -*-
m = 7
for i in xrange(-8, 10 + 1):
print(i % 7)
结果为:
6 0 1 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 3
C++:
#include <iostream>
using namespace std;
int main(){
int m = 7;
for(int i=-8; i <= 10; i++) {
cout << (i % m) << endl;
}
return 0;
}
将输出:
-1 0 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 0 1 2 3
ISO/IEC 14882:2003(E) - 5.6 乘法操作符:
二元 / 操作符生成商,二元 % 操作符生成第一个表达式除以第二个表达式的余数。如果 / 或 % 的第二个操作数为零,则行为未定义;否则(a / b)*b + a%b 等于a。如果两个操作数都是非负的,则余数是非负的;如果不是,则余数的符号由实现定义74)。
和
74) 根据正在进行的 ISO C 修订工作,整数除法的首选算法遵循 ISO Fortran 标准,ISO/IEC 1539:1991 中定义的规则,其中商始终向零舍入。
我找不到免费版本的ISO/IEC 1539:1991
。有人知道在哪里可以获取吗?
这个操作似乎是这样定义的:
这个规范的论据是什么?是否有一个讨论创建此类标准的人员的地方?我在哪里可以阅读一些关于为什么决定以这种方式进行的原因的东西?
大多数情况下,当我使用模运算时,我想要访问数据结构的元素。在这种情况下,我必须确保mod返回一个非负值。所以,对于这种情况,mod总是返回一个非负值会很好。 (另一个用法是欧几里得算法。在使用此算法之前,您可以使两个数字都为正数,那么模数的符号就很重要。)
附加材料:
请参阅维基百科以获取不同语言中模运算执行的长列表。
mod
的正值,详见这里:[https://dev59.com/OGct5IYBdhLWcg3wL6qi#12277233] - zardoshtint ret = a%b; return ret>=0? ret: ret+b;
更糟糕。可以使用条件移位来完成。 - phuclv