我看到很多有竞争力的程序员在C ++中用((a + b) % d + d) % d
编写代码。他们为什么不只使用(a + b) % d
?括号内的+ d
有什么用呢?它与负数有关吗?
由于
答案 0 :(得分:9)
是的,你是对的。在C ++ 11之前,负面参数的余数运算符%
的行为留给了实现,受一些约束。只要该参数中的其他项总和大于或等于d
,向左参数添加-d
就可以提供帮助,而一般情况并非如此。 (对于负-a / d
的情况,d
的{{1}}倍数会在您的特定情况下成为更好的附加常数。)
答案 1 :(得分:2)
是的,它与负数有关。它可以防止在某些条件下结果为负数。在这种情况下,当b
变量为负数时,b % d
的结果也为负数。此结果永远不会超过d
,因此向此结果添加d
会强制结果为正。
下面的代码是Java代码,但它具有相同的原则:
int a = 13;
int b = -23;
int d = 31;
int result1 = (a + b % d + d) % d;
int result2 = (a + b % d) % d;
System.out.println(result1);
System.out.println(result2);
输出以下内容:
21
-10
答案 2 :(得分:0)
为了避免整数溢出并始终保持数字正数,我们使用模运算。
当a为负数时,竞争程序员倾向于使用 (a+b)%b
而不是 a%b
。
a%b = (a+b)%b
(a+b)%b = a%b + b%b = a%b + 0 = a%b
赞a=-2
& b=5
然后a%b = 3