针对project euler 1的范围函数和或python语句的建议

针对project euler 1的范围函数和或python语句的建议,python,python-3.x,Python,Python 3.x,我只是试着把3和5的所有倍数加起来,直到1000,同时确保我不会把重合的倍数加上两倍,从而得到or。如果不是3的倍数,我只希望它加上5的倍数。我知道我可以删除重叠的倍数,但我想知道如果if语句在除以3时不给出余数0,如何使用if语句只添加5的倍数。提前谢谢 a=range(0, 1000,3 ) or range(0,1000,5) b=sum(a) print (b) 您可以使用列表: a = [x for x in range(1000) if ((x % 3 == 0) or (x %

我只是试着把3和5的所有倍数加起来,直到1000,同时确保我不会把重合的倍数加上两倍,从而得到or。如果不是3的倍数,我只希望它加上5的倍数。我知道我可以删除重叠的倍数,但我想知道如果if语句在除以3时不给出余数0,如何使用if语句只添加5的倍数。提前谢谢

a=range(0, 1000,3 ) or range(0,1000,5)
b=sum(a)
print (b)

您可以使用列表:

a = [x for x in range(1000) if ((x % 3 == 0) or (x % 5 == 0))]
b = sum(a)

您可以使用列表:

a = [x for x in range(1000) if ((x % 3 == 0) or (x % 5 == 0))]
b = sum(a)

您可以组合这两个列表并从联合中获取唯一值:

sum(set(range(0, 1000, 3) + range(0, 1000, 5)))

集合是唯一元素的无序列表。因此,这里两个列表,一个是3的倍数,另一个是5的倍数,连接在一起;然后将此新列表转换为“仅保留唯一元素”。

您可以将这两个列表合并,并从并集中获得唯一值:

sum(set(range(0, 1000, 3) + range(0, 1000, 5)))

集合是唯一元素的无序列表。因此,这里两个列表,一个是3的倍数,另一个是5的倍数,连接在一起;然后将此新列表转换为“仅保留唯一元素”。

您只需删除15的所有倍数即可

与其他解决方案相比,这是一个非常残酷的解决方案,但它也非常简单。 求所有3的倍数和所有5的倍数之和。但是,将15的倍数相加两次,因此从最终总和中删除这些倍数:

total = sum(range(0, 1000,3)+range(0,1000,5))-sum(range(0,1000,15))

您可以删除15的所有倍数

与其他解决方案相比,这是一个非常残酷的解决方案,但它也非常简单。 求所有3的倍数和所有5的倍数之和。但是,将15的倍数相加两次,因此从最终总和中删除这些倍数:

total = sum(range(0, 1000,3)+range(0,1000,5))-sum(range(0,1000,15))

这里有一种方法,它总共有5个加法、3个乘法、3个除法和少量的额外内存-

def sumrange(start, stop, step):
    x = xrange(start, stop, step)
    if x:
        return (x[0] + x[-1]) * len(x) // 2
    else:
        return 0

print sumrange(0, 1000, 3) + sumrange(0, 1000, 5) - sumrange(0, 1000, 15)

这取决于算术级数的和等于级数中的元素数乘以第一个和最后一个元素和的平均值的一半。所有这些都可以通过使用Python2中的xrange对象来构造(甚至不生成)列表,而在Python3中使用range-

def sumrange(start, stop, step):
    x = xrange(start, stop, step)
    if x:
        return (x[0] + x[-1]) * len(x) // 2
    else:
        return 0

print sumrange(0, 1000, 3) + sumrange(0, 1000, 5) - sumrange(0, 1000, 15)


这取决于算术级数的和等于级数中的元素数乘以第一个和最后一个元素和的平均值的一半。所有这些都可以通过使用Python2中的xrange对象而不构建(甚至不生成)列表来完成—在Python3中使用range。

好吧,删除重叠。你把所有15的倍数加上两次。哇,三个同时的答案和所有的不同!这是欧拉计划的问题1,请在你的问题中指出这一点。好的,消除重叠。你把所有15的倍数加上两次。哇,三个同时的答案和所有的不同!这是欧拉计划的问题1,请在你的问题中指出。我根本没有想到这一点,这是相当巧妙的。为了提问者的缘故,可能需要添加一个原因来说明为什么这是有效的,关于使用set来消除重复项。是的,set做了什么?答案经过编辑,包含了更多的细节。我根本没有想到这一点,这是相当巧妙的。出于提问者的考虑,可能需要添加一个原因来解释为什么使用set消除重复项。是的,set做了什么?答案经过编辑,包含了更多的细节。如果x%3==0或x%5==0,为什么不在1000范围内对x进行求和呢?@Akavall您可以使用生成器表达式,虽然Python2必须使用xrange,但如果x%3==0或x%5==0,为什么不在生成器理解sumx上求和呢?@Akavall您可以使用生成器表达式,尽管Python2必须使用xrange谢谢,我知道我可以删除重叠的倍数,但我想知道如果if语句在除以3时不给出余数0,如何使用if语句仅添加5的倍数。如果I%3==0或I%5==0,则在1000范围内确定-sumi。有很多方法可以做到这一点。谢谢,我知道我可以删除重叠的倍数,但我想知道如果if语句在除以3时不给出余数0,我如何使用if语句只添加5的倍数。如果I%3==0或I%5==0,请确定-sumi for I的范围为1000。有很多方法可以做到这一点。这些似乎有点复杂和复杂。哈哈,你认为呢?;-但是,正如广告所宣传的,这是一个非常快速的程序,即使是SumRange110000000002这样的东西也不需要内存。别误会我的意思。不是说它不好,只是很复杂,至少值得解释一下它的优点。这些看起来有点复杂和复杂。哈哈,你觉得呢?;-但是,正如广告所宣传的,这是一个非常快速的程序,即使是SumRange110000000002这样的东西也不需要内存。别误会我的意思。不是说它不好,只是很复杂,至少值得解释一下它的优点。