有没有一种有效的方法可以得到最小的非负残差模n,其中n是正的,在C?
如果数字是非负数,那么这很容易,那么它只是%n(其中a是非负整数).
但是当a为负数时,C89中的行为似乎是实现定义的(感谢kennyTM).即-2%11 = -2或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)
此外,在C99中,行为被定义为恼人的行为:-2%11 = -2.
一般情况下(即,n % m当m不恒定且范围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)