模块化算术 - 竞争性编程

时间:2017-07-12 13:58:38

标签: c++ math modular-arithmetic

我看到很多有竞争力的程序员在C ++中用((a + b) % d + d) % d编写代码。他们为什么不只使用(a + b) % d?括号内的+ d有什么用呢?它与负数有关吗?

由于

3 个答案:

答案 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