计算网格路径时,两种整数运算赋值写法为何返回不同结果?
两种写法的差异原因:运算顺序与整数除法时机
核心问题在于运算顺序不同导致整数除法的时机不一样,直接影响了计算精度:
正确写法:result = result * (x + i) / i
这个表达式的运算顺序是:
- 先计算
result * (x + i):由于result是long类型,x+i会被自动提升为long,相乘的结果也是long。 - 再用这个乘积除以
i:因为中心二项式系数的迭代过程中,每一步的乘积result*(x+i)必然能被i整除(中间结果都是组合数,组合数是整数),所以这里的除法是精确的整数除法,不会丢失任何精度。
举个具体的例子(x=20,i=3时):
- 此时
result的值是231(前两步计算后的结果) - 先算
231 * 23 = 5313(long类型,无溢出) - 再算
5313 / 3 = 1771,这是精确的正确结果
错误写法:result *= (x + i) / i
复合赋值运算符*=的运算顺序是先计算右侧的表达式,再执行乘法:
- 先计算
(x + i) / i:x和i都是int类型,这是int类型的整数除法,会直接截断小数部分。当x+i不能被i整除时,这里的结果就会不准确。 - 再用这个不准确的结果乘以
result,导致最终结果偏差。
同样用x=20,i=3的例子:
- 先算
(20+3)/3 = 23/3 = 7(int除法截断了余数2) - 再算
231 * 7 = 1617,这和正确结果1771相差了154,显然错误
关键本质
中心二项式系数的迭代计算依赖于「先乘后除」的顺序,因为每一步的乘法结果必然能被除数整除,保证了整数除法的精确性;而「先除后乘」会提前触发截断,破坏了计算的精确性。
内容的提问来源于stack exchange,提问作者user29150577
相关产品推荐
相关产品推荐

