我有什么需要改变我的程序来解决这个烦人的错误代码?

时间:2017-07-21 22:24:40

标签: python

我一直在尝试编写一个解决以下问题的程序:

如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9.这些倍数的总和是23.

查找低于1000的3或5的所有倍数的总和。

为了解决这个问题,我想我可能会编写一个函数,列出所有3的倍数。我希望它将我的列表称为“3”,并将最后一个数字乘以3.然后添加该数字回到列表中。然后重复它直到达到1000.(或在这种情况下,999)

当我尝试运行它时,错误消息让我感到困惑。该计划有什么问题?

null

以下是错误消息:

three = [3, ]

def multiples_of_three():
    while (three != 999):
        high = (max(three))
        multiplied_three = (int(high *3))
        next_number_three = (multiplied_three, )
        three.append("next_number_three")

multiples_of_three()
print (three)

3 个答案:

答案 0 :(得分:1)

"next_number_three"左右删除引号。

答案 1 :(得分:1)

这是另一种选择,我认为这种方式更具可读性:

def get_multiples(multiple, maximum):
    return [i for i in range(multiple, maximum, multiple)] # return all multiples in a list

def get_sum_of_multiples(multiples, maximums):
    all_multiples = set() # empty set
    for multiple, maximum in zip(multiples, maximums): # Iterate through the multiples and maximums
        current_multiples = get_multiples(multiple, maximum) 
        for num in current_multiples:
            all_multiples.add(num) # We add the multiples to a set because it will remove duplicates for us
    return sum(all_multiples) # return the sum of them all


multiples = [3, 5]
maximums = [1000, 1000]
print(get_sum_of_multiples(multiples, maximums))

此外,我们可以使该功能更通用,并用它来解决你的例子,这可能是这样的:

{{1}}

答案 2 :(得分:0)

请注意,我知道您可能需要使用特定技术将其写为家庭作业,但这里有一种更加抒情的方式:

multiples_of_three_or_five = [i for i in range(1,1000) if i % 3 == 0 or i % 5 == 0]
print sum(multiples_of_three_or_five)

或者你可以超级想象,只是笔和纸数学;)

编辑:花式数学:

将从1到N的整数求和得到N *(N + 1)/ 2。

将3的倍数加到1000以下,得到3 * 332 * 333/2。

将5的倍数加到1000以下得到5 * 199 * 200/2

现在,只是添加这两个数字就会给出错误的答案,因为你要重复计算那些3 5的倍数。但这些数字恰好是15的倍数,所以我们减去那些。我们检查1000/15 = 66.something,所以66 * 15仍然低于1000,所以我们减去

15 * 66 * 67/2

因此最终答案是232169