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
相关产品推荐
相关产品推荐

