对于模,我发现下面最简单的。实现的符号约定是什么并不重要,我们只是将结果强制到我们想要的符号:
r = n % a;
if (r < 0) r += a;
显然,这是为了积极的一面。对于负数 a,您需要:
r = n % a;
if (r > 0) r += a;
这(也许有点令人困惑)组合在一起给出了以下内容(C++。在C中,用int做同样的事情,然后乏味地长时间写一个重复:
template<typename T> T sign(T t) { return t > T(0) ? T(1) : T(-1); }
template<typename T> T py_mod(T n, T a) {
T r = n % a;
if (r * sign(a) < T(0)) r += a;
return r;
}
我们可以使用一个廉价的双值“sign”函数,因为我们已经知道a!=0,否则%将是未定义的。
将相同的原理应用于除法(查看输出而不是输入):
q = n / a;
// assuming round-toward-zero
if ((q < 0) && (q * a != n)) --q;
可以说,乘法可能比必要的更昂贵,但如果需要,可以在以后根据每个架构进行微优化。例如,如果你有一个除法操作,给你商和余数,那么你被排序为除法。
[编辑:可能存在一些边缘情况,例如,如果商或余数INT_MAX或INT_MIN。但是,无论如何,模拟Python对大值的数学是另一个问题;-)]
[另一个编辑:标准的python实现不是用C语言编写的吗?你可以搜索他们所做的事情的来源]