如何在C++中计算-1 modulo 1000000007

Ram*_*chi 4 c++ algorithm modulo

我试图使用%C++和fmod函数的运算符得到-1 modulo 1000000007的结果.
输出是-1,但是-1 modulo 1000000007==1000000006.

我做错了什么?

Ded*_*tor 8

简单地说,你选错了算子.

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范围内