Hailiang Zhang
Hailiang Zhang

Reputation: 18950

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

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!

Upvotes: 27

Views: 22345

Answers (6)

Sidney CQ
Sidney CQ

Reputation: 1

I see a lot of suggestions for ((x % 5) + 5) % 5 But I'm getting the same result with just (X + 5) % 5

(X + divisor) % divisor.

Upvotes: -2

ysth
ysth

Reputation: 98453

Most easily: ((x % 5) + 5) % 5

Upvotes: 34

shubham kapoor
shubham kapoor

Reputation: 599

int x=-3;

// first approach
cout<<((x % 5) + 5) % 5;

//second approach means just reverse the number modNum%x
cout<<5%x;

Upvotes: 0

Qwertie
Qwertie

Reputation: 17216

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<class Num> 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.

Upvotes: 7

perreal
perreal

Reputation: 98118

Add the base if the input number X is negative:

X % Y + (X % Y < 0 ? Y : 0);

Upvotes: 9

sampson-chen
sampson-chen

Reputation: 47367

You can add some multiple of 5 to the negative number first, to convert it to a positive number with the same value mod 5.

You can do that by taking the absolute of the negative number, adding whatever is needed to round it up to the next multiple of 5, and then add it to your negative number, and that should already be a number between 0 and 4.

Alternatively, simply do something like:

num = -2;
mod = 5;
if ( num < 0 ) {
    result = mod - (abs(num) % mod);
}

and it'll work (explanation: mathemagic)

Upvotes: 4

Related Questions