我不是在问定义,而是为什么语言创建者选择在 C++ 中定义具有不对称行为的模数。(我也认为Java)
假设我想找到大于或等于 n 且可被 f 整除的最小数。
如果 n 是正数,那么我会:
if(n % f)
ans = n + f - n % f;
如果 n 为负数:
ans = n - n % f;
显然,这个定义在处理负数和正数时并不是最方便的。那么为什么会这样定义呢?在什么情况下它会产生权宜之计?
我不是在问定义,而是为什么语言创建者选择在 C++ 中定义具有不对称行为的模数。(我也认为Java)
假设我想找到大于或等于 n 且可被 f 整除的最小数。
如果 n 是正数,那么我会:
if(n % f)
ans = n + f - n % f;
如果 n 为负数:
ans = n - n % f;
显然,这个定义在处理负数和正数时并不是最方便的。那么为什么会这样定义呢?在什么情况下它会产生权宜之计?
因为它使用“模 2 算术”,其中每个二进制数字都独立处理。在此处查看有关“除法”的示例
你错了。当n
为负时,只要%
and的结果/
一致,C++ 允许模运算符的结果为负或正,因此对于任何给定的a
and b
,表达式(a/b)*b + a%b
将始终 yield a
。C99 要求a % b
will 的结果与 具有相同的符号a
。其他一些语言(例如 Python)要求 的符号与 . 的a % b
符号相同b
。
这意味着您为否定给出的表达式n
实际上并不需要在 C++ 中工作。当/如果n%f
产生一个正数(即使n
是负数),它会给出ans
小于n
.