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

时间:2014-09-27 21:37:52

标签: c++ algorithm modulo

我试图使用C ++的%运算符得到-1 modulo 1000000007的结果 和fmod功能。
输出为-1,但-1 modulo 1000000007==1000000006

我做错了什么?

2 个答案:

答案 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。

Wikipedia on modulo

模数是欧几里德除法的余数,并且始终在范围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;
}