我看到很多竞赛程序员在C++中使用
谢谢
((a + b) % d + d) % d
编写代码。为什么他们不只是使用(a + b) % d
呢?括号内的+d
有何用处?它与负数有关吗?谢谢
((a + b) % d + d) % d
编写代码。为什么他们不只是使用(a + b) % d
呢?括号内的+d
有何用处?它与负数有关吗?是的,你说得对。在C++11之前,负数取模运算符%
的行为是由实现决定的,但受到一些限制。将d
添加到左操作数可以帮助解决这个问题,只要该操作数中的其他项总和大于或等于-d
,但通常情况下并非如此。(对于负a
的情况,-a / d
倍的d
可能是你特定情况下更好的加法常数。)
是的,它与负数有关。在某些条件下,它可以防止结果为负数。在这种情况下,当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
(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
((a + b) % d + d) % d
吗? - Mark Dickinson