假设 n 和 p 是 C 程序中的 unsigned int 变量。我们希望将 p 设置为n C 3 。如果 n 很大,以下哪个语句最有可能正确设置 p?
(A) p = n * (n-1) * (n-2) / 6;
(B) p = n * (n-1) / 2 * (n-2) / 3;
(C) p = n * (n-1) / 3 * (n-2) / 2;
(D) p = n * (n-1) * (n-2) / 6.0;答案:(乙)
说明:由于 n 很大,乘积 n*(n-1)*(n-2) 将超出范围(溢出),并且将返回与预期不同的值。因此,排除选项(A)和(D)。
所以我们考虑更短的乘积 n*(n-1)。
n*(n-1) 总是偶数。所以选项 B 中的子表达式“n * (n-1) / 2”总是会产生一个整数,这意味着在这个子表达式中没有精度损失。当我们考虑“n*(n-1)/2*(n-2)”时,它总是给出一个3的倍数。所以除以3不会有任何损失。
这个问题的测验