You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python新手求助:两段看似等价的求和代码为何输出结果不同

结果差异原因

你两段代码输出不一致的核心问题是重复计算了同时为3和5倍数(即15的倍数)的数值。

两段代码的逻辑区别

  • 你写的代码:分别计算1000以内所有3的倍数的和、所有5的倍数的和,再将两个和直接相加。这个逻辑下,所有15的倍数既属于3的倍数集合,又属于5的倍数集合,相当于被累计加了2次,最终结果必然偏大。你得到的266333和正确结果233168的差值为33165,正好等于1000以内所有15的倍数的总和,就是多算的这部分。
  • 参考的他人代码:使用了Python集合的并集运算符|,会自动剔除两个集合中重复的元素——也就是同时出现在两个集合里的15的倍数只会保留1份,最终求和时每个符合条件的数仅被计算1次,结果是正确的。

修正方案

如果想保留分开求和再相加的写法,只要按照容斥原理减去重复计算的交集部分(15的倍数的和)即可,修正后的代码如下:

sum3 = sum({*range(3, 1000, 3)})
sum5 = sum({*range(5, 1000, 5)})
sum15 = sum({*range(15, 1000, 15)})
print(sum3 + sum5 - sum15)

运行这段代码输出的结果和参考代码完全一致,都是233168。

补充说明:这道题是Project Euler的第一题,核心考点就是集合计数的容斥原理,直接对两个有重叠的集合求和相加时,必须减去重叠部分的计数,否则就会出现结果偏大的问题。

内容的提问来源于stack exchange,提问作者Narathen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:15:28