简单地说,你选错了算子.
C++和C % 不是模数,而是余数.
assert(a / b * b + a % b == a); // for integral types
Run Code Online (Sandbox Code Playgroud)
如果a是非负的,则模数和余数是相同的.
否则返回值为负,只需添加b.
template<class T>
inline constexpr auto
modulo(T a, T b) -> decltype(a%b) {
auto r = a % b;
if(r<0) r += b;
return r;
}
Run Code Online (Sandbox Code Playgroud)
或(也)为C:
#define modulo(a, b) (a%b<0 ? a%b+b : a%b)
Run Code Online (Sandbox Code Playgroud)
为了完整性:在C++ 11之前,a / b总是可以向下舍入而不是总是为0,尽管C++ 03已经注意到下一个标准可能要求舍入到0.
Modulo是euclidiean除法的余数,总是在0 <= modulo <divisor范围内