我试图使用C ++的%
运算符得到-1 modulo 1000000007的结果
和fmod
功能。
输出为-1
,但-1 modulo 1000000007==1000000006
。
我做错了什么?
答案 0 :(得分:8)
简单地说,你选错了算子。
C ++和C %
不是模数,而是余数。
assert(a / b * b + a % b == a); // for integral types
如果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;
}
或(也)代表C:
#define modulo(a, b) (a%b<0 ? a%b+b : a%b)
为了完整性:在C ++ 11之前,a / b
总是可以向下舍入而不是总是为0,尽管C ++ 03已经注意到下一个标准可能要求舍入到0。
模数是欧几里德除法的余数,并且始终在范围0 <= modulo&lt;除数
答案 1 :(得分:0)
处理负除数和正除数的模函数:
template<class T>
inline constexpr auto
modulo(T a, T b) -> decltype(a%b) {
auto r = a % b;
if((b > 0 && r < 0) || (b < 0 && r > 0))
r += b;
return r;
}