Project Euler Problem 23 Python代码输出错误原因求解
错误原因分析
- 盈数收集范围设置错误
你仅遍历了1~14061的数筛选盈数,但大于14061的数也可以是盈数,只要满足「盈数 + 最小盈数12 ≤ 28123」即可,即盈数的遍历上限应该为28123 - 12 = 28111。你漏掉了14062~28111区间的所有盈数,导致大量两个盈数的和没有被纳入AbSums集合,最终统计的「无法表示为两盈数之和的数」远多于实际值,总和偏大。 - 因数和计算使用浮点除法存在精度误差
你的SumProper函数计算因数和时使用了/运算符,Python3中该运算符返回浮点数,当数值较大时,浮点数精度不足会导致计算结果偏差,转int后会得到错误的真因数和,直接导致部分盈数没有被识别,这也是你观察到14000之后盈数统计偏少的核心原因。计算整数除法应该使用//运算符避免浮点误差。
错误结果31531501的产生逻辑
你收集的盈数集合缺失了大量14000以上的盈数,同时因为浮点误差漏判了部分本应属于盈数的数值,最终AbSums集合的元素数量远少于实际值,很多本可以表示为两盈数之和的数没有被过滤掉,全部被计入了最终的总和,就得到了31531501这个错误结果。
内容的提问来源于stack exchange,提问作者Chubby Chef
相关产品推荐
相关产品推荐

