LeetCode与本地Python解释器计算结果不一致问题求助
LeetCode 1283《Find The Smallest Divisor》:math.ceil(i/mid)提交失败的原因分析
核心问题:浮点数精度误差
你遇到的问题本质是浮点数运算的精度损失导致math.ceil(i/mid)计算出错,而-(-i//mid)用纯整数运算完全避免了这个问题。
math.ceil(i/mid)的逻辑是先做浮点数除法i/mid,再对结果向上取整。但当i和mid的数值很大时(比如接近Python浮点数的精度上限2^53),浮点数无法精确表示所有整数,会出现近似值。例如某个整数结果会被存储成略小于它的浮点数,这时候math.ceil就会返回错误的数值,导致总和s计算偏差,最终二分查找得到错误的除数。-(-i//mid)是纯整数运算:i//mid是Python的地板除法(向下取整),对正整数来说,-i//mid会得到向下取整后的负数,再取负就等价于向上取整。整个过程没有浮点数参与,完全不会有精度损失,结果绝对准确。
关于账号提交差异的解释
朋友用他的账号提交你的原代码能通过,只是刚好没触发那些包含大数的极端测试用例。LeetCode的测试用例执行可能存在一定的随机性或者覆盖范围差异,你的账号提交时刚好命中了触发浮点数精度问题的测试用例,导致结果错误。
代码对比
原代码关键行(存在风险):
s += math.ceil(i/mid)
修改后可靠的代码:
s += -(-i//mid)
内容的提问来源于stack exchange,提问作者Gokulkrishna V
相关产品推荐
相关产品推荐

