使用python时间复杂度的项目Euler#1

时间:2018-12-05 17:41:07

标签: python

Problem #1 of Project Euler读为:

  

如果我们列出所有低于10的自然数,这些自然数是3或的倍数   5,我们得到3、5、6和9。这些倍数的总和为23。

     

找到1000以下的3或5的所有倍数之和。

这是我的尝试:

T = int(input())

for i in range(T):
    sum = 0
    a = int(input())
    for j in range(a):
        if (j%3==0 or j%5==0):
            sum = sum + j

print(sum)

上面的代码增加了时间复杂度,即在某些情况下运行时间大于10。 您可以在此处找到详细信息: enter image description here

1 个答案:

答案 0 :(得分:0)

您可以计算所有n且低于m的自然数之和,作为梯形区域:

def sum_multiples(n, m):
    d = (m - 1) // n
    return (1 + d) * d // 2 * n

,因此{<1> 的时间复杂度可以通过计算3的所有倍数的总和来计算m下3或5的所有倍数的总和加5的所有倍数的总和减去15的所有倍数的总和,即3和5的最低公分母:

def sum_3_5(m):
    return sum_multiples(3, m) + sum_multiples(5, m) - sum_multiples(15, m)

为回答这个问题,sum_3_5(1000)返回:

233168