繁体   English   中英

将 0 添加到 Project Euler 问题 23 “Non-Abundant Sums” 的列表中会改变答案

[英]Adding a 0 to the list for Project Euler Problem 23 “Non-Abundant Sums” changes the answer

我是编程初学者,我正在尝试练习 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 中,但下面的代码给了我 [] 作为 output,因此它不是。

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))

Output:

4179871
4178876
acquired abundant numbers {0}
lost summed numbers {945, 18, 12, 20}

...并且有明显的证据:三个小于 24 的数字,这被称为符合求和条件的最低数字。 这些中的每一个都很丰富,第一个添加的 output 行显示您的代码错误分配了 0 作为丰富。

这是最基本的调试技术之一:当您的预期和实际 output 存在明显差异时,打印或以其他方式比较中间值以找到差异点。

您注意到我没有将其跟踪到您的代码中:您没有使其易于阅读。 有关建议,请参阅 PEP-8指南

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM