How to make the mod of a negative number to be positive?

后端 未结 6 1202
独厮守ぢ
独厮守ぢ 2021-02-18 13:03

Basically, I need (-3) % 5 to be \"2\" instead of \"-3\". Python produces \"2\", but C++ produces \"-3\". Not sure how to produce \"2\" in C++. Thanks!

6条回答
  •  情深已故
    2021-02-18 13:36

    The quick & dirty way is to write

    ((x % divisor) + divisor) % divisor
    

    For example, ((-3 % 5) + 5) % 5 == 2. However this performs two separate divisions, and since divisions are one of the slowest arithmetic operations you might like one of these alternatives:

    (1) General mod for integer or floating point

    int mod(int x, int divisor)
    {
        int m = x % divisor;
        return m + (m < 0 ? divisor : 0);
    }
    
    template Num mod(Num x, Num divisor)
    {
        Num m = x % divisor;
        return m + (m < 0 ? divisor : 0);
    }
    

    (2) Non-branching mod for 32-bit integers

    int mod(int x, int divisor)
    {
        int m = x % divisor;
        return m + ((m >> 31) & divisor);
    }
    

    All this assumes that the divisor is always positive.

提交回复
热议问题