5

我不是在问定义,而是为什么语言创建者选择在 C++ 中定义具有不对称行为的模数。(我也认为Java)

假设我想找到大于或等于 n 且可被 f 整除的最小数。

如果 n 是正数,那么我会:

if(n % f)
   ans = n + f - n % f;

如果 n 为负数:

ans = n - n % f;

显然,这个定义在处理负数和正数时并不是最方便的。那么为什么会这样定义呢?在什么情况下它会产生权宜之计?

4

2 回答 2

1

因为它使用“模 2 算术”,其中每个二进制数字都独立处理。在此处查看有关“除法”的示例

于 2011-09-17T01:04:46.903 回答
1

你错了。当n为负时,只要%and的结果/一致,C++ 允许模运算符的结果为负或正,因此对于任何给定的aand b,表达式(a/b)*b + a%b将始终 yield a。C99 要求a % bwill 的结果与 具有相同的符号a。其他一些语言(例如 Python)要求 的符号与 . 的a % b符号相同b

这意味着您为否定给出的表达式n实际上并不需要在 C++ 中工作。当/如果n%f产生一个正数(即使n是负数),它会给出ans小于n.

于 2011-09-17T05:30:50.543 回答