如何使负数的mod变为正数?

时间:2012-12-10 02:26:31

标签: c++

基本上,我需要(-3) % 5为“2”而不是“-3”。 Python产生“2”,但C ++产生“-3”。不知道如何在C ++中生成“2”。谢谢!

6 个答案:

答案 0 :(得分:20)

((x % 5) + 5) % 5但我确信这是一种更优雅的方式。

答案 1 :(得分:6)

如果输入数字X为负数,请添加基数:

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

答案 2 :(得分:2)

快速&amp;肮脏的方式是写

((x % divisor) + divisor) % divisor

例如,((-3 % 5) + 5) % 5。然而,这会执行两个单独的分区,并且由于分区是最慢的算术运算之一,您可能会喜欢以下其中一个:

(1)整数或浮点的常规mod

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)32位整数的非分支mod

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

所有这些都假定divisor始终为正。

答案 3 :(得分:1)

您可以先将5的倍数添加到负数,然后将其转换为具有相同值mod 5的正数。

您可以通过取负数的绝对值,添加所需的内容将其四舍五入到下一个5的倍数,然后将其添加到负数,这应该是0到0之间的数字4。

或者,只需执行以下操作:

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

它会起作用(解释: mathemagic

答案 4 :(得分:0)

int x=-3;

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

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

答案 5 :(得分:-2)

我看到了很多关于 ((x % 5) + 5) % 5 的建议但是我得到了相同的结果 (X + 5) % 5

(X + 除数) % 除数。