27

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

4

6 回答 6

30

最容易:((x % 5) + 5) % 5

于 2012-12-10T02:29:17.183 回答
9

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

X % Y + (X % Y < 0 ? Y : 0);
于 2012-12-10T02:30:14.990 回答
6

快速而肮脏的方法是写

((x % divisor) + divisor) % divisor

例如,((-3 % 5) + 5) % 5 == 2。但是,这会执行两个单独的除法,并且由于除法是最慢的算术运算之一,您可能会喜欢以下替代方法之一:

(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);
}

mod(2) 32 位整数的非分支

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

所有这些都假设divisor总是积极的。

于 2018-06-17T21:35:56.830 回答
3

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

您可以通过取负数的绝对值,加上所需的任何值将其向上舍入到下一个 5 的倍数,然后将其添加到负数,这应该已经是 0 到 4 之间的数字。

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

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

它会起作用(解释:mathemagic

于 2012-12-10T02:28:27.877 回答
0
int x=-3;

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

//second approach means just reverse the number modNum%x
cout<<5%x;
于 2020-01-25T07:13:27.257 回答
-2

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

(X + 除数) % 除数。

于 2021-02-08T16:32:35.610 回答