繁体   English   中英

如何使负数的模为正数?

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

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

最简单: ((x % 5) + 5) % 5

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

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

快速而肮脏的方法是写

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

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

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

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

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

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

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

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

它会起作用(解释: mathemagic

int x=-3;

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

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

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

(X + 除数) % 除数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM