假设n和p是C程序中的无符号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;答案: (B)
说明:当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不会有任何损失。
这个问题的测验