基本上,我需要(-3) % 5
是“2”而不是“-3”。Python 产生“2”,但 C++ 产生“-3”。不确定如何在 C++ 中生成“2”。谢谢!
问问题
17155 次
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 回答