CS50实验C语言中n/12与n/3减n/4的整数运算差异问询
差异原因
本质是C语言整数除法向零截断的规则导致数学上等价的两个式子在整数运算下结果不同:
你举的n_initial=10的场景就能直接说明问题:
- 第一段代码的
n_initial / 12运算:
10除以12的结果小于1,整数截断后直接得到0,每次循环n_initial加0,值永远停留在10,永远满足n_final > n_initial的循环条件,自然会死循环。
// 第一段代码死循环逻辑 n_initial = 10; n_initial += 10/12; // 10/12=0,n_initial永远是10
- 第二段代码的
(n_initial/3) - (n_initial/4)运算:
10除以3截断为3,10除以4截断为2,差值为1,每次循环n_initial可以加1,最终会涨到超过100跳出循环。
// 第二段代码正常运行逻辑 n_initial = 10; n_initial += (10/3) - (10/4); // 3-2=1,n_initial每次增长1
补充说明
对于所有正整数n,(n/3 - n/4)的整数运算结果都大于等于n/12的整数运算结果,尤其当n<12时,前者依然能得到正的增量,后者直接为0,这就是为什么第二段代码可以正常运行,第一段代码在小数值场景下会死循环。
如果想要第一段写法也能达到预期,可以在循环前增加边界判断,或者先转浮点计算后再转回整数,但要注意精度误差问题,当前场景下显然第二段拆分后的写法更适配整数运算的规则。
内容的提问来源于stack exchange,提问作者Lulusi
相关产品推荐
相关产品推荐

