Project Euler第1题Python实现结果错误,排查理解偏差或代码Bug
如果我们列出所有10以下是3或5倍数的自然数,会得到3、5、6、9,这些倍数的和是23。请求出所有1000以下3或5的倍数的总和。
你遇到的问题属于代码本身存在逻辑Bug,对题目的理解没有偏差。
问题出在判断条件的多余限制:题目要求统计的是「3或5的倍数」,逻辑或规则下只要满足其中一个整除条件就可以计入,包括同时被3和5整除的15的倍数。但你写的两个判断条件都额外加了排除另一个数整除的逻辑,导致所有15的倍数既没有被加入mult3也没有被加入mult5,直接被漏算,最终结果偏小。
1000以下所有15的倍数的总和为33165,你得到的200003加33165正好等于正确答案233168。
修正后的代码示例
1. 基于原有逻辑修改,简化判断条件
total = 0 for i in range(1000): if i % 3 == 0 or i % 5 == 0: total += i print(total)
2. 更高效的数学公式法(容斥原理,无需循环)
利用容斥原理:3的倍数总和 + 5的倍数总和 - 15的倍数总和(15的倍数被重复加了两次,需要减去一次)
def sum_multiples(n, limit): # 计算limit以下所有n的倍数的和 count = (limit - 1) // n return n * count * (count + 1) // 2 print(sum_multiples(3, 1000) + sum_multiples(5, 1000) - sum_multiples(15, 1000))
内容的提问来源于stack exchange,提问作者Kevincheong
相关产品推荐
相关产品推荐

