项目Euler#1 python代码不起作用

时间:2015-10-23 19:17:15

标签: python python-3.x

对于Project Euler,question #1

  

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

     

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

我正在尝试使用Python,我有以下代码:

    def findNums():
        numsToAdd = []
        num = 1
        while num < 999:
            if 3 % num == 0 or 5 % num == 0:
                numsToAdd.extend([num])
            num +=1
            #print(num) optional
        for i in numsToAdd:
            lastNum = 0
            addition = numsToAdd[i] + lastNum
            lastNum = numsToAdd[i]
        print(lastNum)
    findNums()

但是当我尝试运行它时出现以下错误:

addition = numsToAdd [i] + lastNum

IndexError:列表索引超出范围

有人可以告诉我这是什么以及如何解决它?

2 个答案:

答案 0 :(得分:2)

你有几个问题:

if 3 % num == 0 or 5 % num == 0:

你的条件是落后的。你现在如何设置它,你正在检查3或5是否可以被num整除,而不是num可以被3或5整除。

for i in numsToAdd:

假设到达此点时numsToAdd具有以下值:[100, 500]

当你到达addition = numsToAdd[i] + lastNum时,你会说:

addition = numsToAdd[100] + lastNum

addition = numsToAdd[500] + lastNum

没有第100或第500个元素。相反,您可以删除索引(以保留现有格式):

addition = i + lastNum

您也可以这样做,将列表中的所有值添加到一行:

sum(numsToAdd)

这可以替换整个for循环。

最后,您的第一个while错了:

  

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

您正在检查低于999的所有内容。更改while循环:

while num < 1000:

答案 1 :(得分:0)

您的代码存在的问题是,您的列表numsToAdd中只有465个项目。 而不是:

numsToAdd[0]
numsToAdd[1]
numsToAdd[2]
.
.
numsToAdd[462]
numsToAdd[463]
numsToAdd[464]

你这样做:

numsToAdd[3]
numsToAdd[5]
numsToAdd[6]
.
.
numsToAdd[459]
numsToAdd[460]
numsToAdd[462]

发生错误是因为列表索引超出范围!没有numsToAdd[465]