python - 将 0 添加到 Project Euler 问题 23“Non-Abundant Sums”的列表中会改变答案
问题描述
我是编程初学者,我正在尝试练习 Project Euler 问题。问题 23:
完美数是一个数,其真因数之和正好等于该数。例如,28 的适当因数之和为 1 + 2 + 4 + 7 + 14 = 28,这意味着 28 是一个完美数。
一个数 n 如果其真因数之和小于 n 则称为不足数,如果该数之和超过 n 则称为丰富数。
由于 12 是最小的丰度数,1 + 2 + 3 + 4 + 6 = 16,所以可以写成两个丰度数之和的最小数是 24。通过数学分析,可以证明所有大于28123 可以写成两个丰富数之和。但是,即使已知不能表示为两个丰富数之和的最大数小于该上限,也无法通过分析进一步降低该上限。
找出所有不能写成两个丰富数之和的正整数之和。
我通过以下代码得到了正确答案:
list1=[]
list2=[]
for num in range(1,28123):
list1.append(num)
for num in list1:
sum1=1
for i in range (2,int(num**0.5)+1):
if not num%i:
sum1+=(i+(num/i))
if int(num**0.5)==(num**0.5):
sum1-=(num**0.5)
if sum1>num:
list2.append(num)
for i in range(len(list2)):
for j in range(i,len(list2)):
check=list2[i]+list2[j]
if check<28123:
list1[check-1]=0
print(sum(list1))
我试图通过以下代码添加“0”来更改 list1 的定义,从而对此代码进行小幅修改:
list1=[x for x in range (28123)]
list2=[]
for num in list1:
sum1=1
for factor in range (2,int(num**0.5)+1):
if not num%factor:
sum1+=(factor+(num/factor))
if int(num**0.5)==(num**0.5):
sum1-=(num**0.5)
if sum1>num:
list2.append(num)
for i in range(len(list2)):
for j in range(i,len(list2)):
check=list2[i]+list2[j]
if check<28123:
list1[check]=0
print(sum(list1))
如您所见,我还根据新索引更改了倒数第二行。但这将我的答案从 4179871 更改为 4178876。我不明白为什么。前者是正确答案。我知道我的代码效率不高,因为我是初学者,正在努力改进。帮助将不胜感激!
编辑:
我试图检查 0 是否被添加到丰富数字的 list2 中,但是下面的代码给了我 [] 作为输出,因此不是。
num = 0
list2 = []
sum1 = 1
for i in range (2, int (num ** 0.5) + 1):
if not num % i:
sum1 += (i+ (num / i))
if int (num ** 0.5) == (num ** 0.5):
sum1 -= (num ** 0.5)
if sum1 > num:
list2.append(num)
print(list2)
解决方案
你插入了 0;您的代码认为这是一个丰富的数字。因此,任何以前不是其他两个之和的丰富数……突然变成了它自己和 0 的和。它被排除在列表之外。
我强烈建议您学习执行基本的逻辑调试。我通过简单的插入确定了这一点。我将您的两种算法都粘贴到了一个文件中。在这两者之间,我保存了第一个算法的结果:
...
print(sum(list1))
keep1 = list1
keep2 = list2
然后,在第二种算法之后,我简单地发现了你在两种算法中形成的列表之间的差异:
print("acquired abundant numbers", set(list2) - set(keep2))
print("lost summed numbers", set(keep1) - set(list1))
输出:
4179871
4178876
acquired abundant numbers {0}
lost summed numbers {945, 18, 12, 20}
...并且有明显的证据:三个小于 24 的数字,这被称为符合求和条件的最低数字。每一个都很丰富,第一个添加的输出行显示您的代码错误地将 0 分配为丰富。
这是最基本的调试技术之一:当您的预期输出和实际输出存在明显差异时,打印或以其他方式比较中间值以找到差异点。
您注意到我没有将其跟踪到您的代码中:您没有使其易于阅读。有关建议,请参阅 PEP-8指南。
推荐阅读
- arrays - 如何在本机反应中以单独的行显示嵌套数组中的项目?
- c# - 在c#中压缩时保留文件夹权限
- terraform - 如何使 Terraform 提供程序支持导入?
- jsf - 动态primefaces menuItem不会触发命令
- excel - 使用表格中的数据在 Excel 中查找最接近的匹配项
- apache-pig - 在 GCP Dataproc 上运行 Bash 脚本
- javascript - 如何在 React.js 中将事件函数分配给 DOM 列表
- realm - SwiftUI Navigation 自动关闭/弹出 - 领域
- c++ - 如何在没有现有引擎的游戏中设计我的 EventTrigger 框架?
- javascript - JS 从对象数组中过滤某些部分