在C中获得最小非负残差模n的有效方法是什么?

sna*_*nap 4 c math

有没有一种有效的方法可以得到最小的非负残差模n,其中n是正的,在C?

如果数字是非负数,那么这很容易,那么它只是%n(其中a是非负整数).

但是当a为负数时,C89中的行为似乎是实现定义的(感谢kennyTM).即-2%11 = -2或9.

sth*_*sth 9

您只需检查结果是否为负数,然后采取相应措施:

int mod(int n, int m) {
   int r = n % m;
   if (r < 0)
      return r + m;
   else
      return r;
}
Run Code Online (Sandbox Code Playgroud)

或者,没有if-then-else和单个表达式:

r = ((n % m) + m) % m;
Run Code Online (Sandbox Code Playgroud)


Joh*_*all 8

此外,在C99中,行为被定义为恼人的行为:-2%11 = -2.

一般情况下(即,n % mm不恒定且范围n不受限制时),您可能无法比通常做得更好

res = ((n % m) + m) % m
Run Code Online (Sandbox Code Playgroud)

将它与您平台上的以下内容进行比较可能会很有趣; 一个分支可能会赢得额外的模数:

res = n % m;
if (res < 0)  res += m;
Run Code Online (Sandbox Code Playgroud)