HackerRank Project Euler#1

时间:2016-08-28 04:17:15

标签: python

这段代码有什么问题?它没有通过案例2& 3关于HackerRank。

T=long(input())
while T>0:
    N=long(input())
    sum=0
    for i in range (1,N):
        if i%3==0 or i%5==0:
            sum+=i
    print (sum)
    T-=1

我是编程新手,无法弄清楚我做错了什么。

https://www.hackerrank.com/contests/projecteuler/challenges/euler001

2 个答案:

答案 0 :(得分:0)

代码有几个问题。首先,因为你正在使用long我想你是在Python 2上运行它。在Python 2上range将生成一个list,因为问题描述状态你将耗尽内存最高N10^9。您可以通过切换到返回xrangexrange object来解决该问题。

如果您进行上述更改,第二个问题就是速度。由于最大N10^5,您可能需要迭代10^14个数字,这需要太长时间。为了修复所使用的算法需要改变。您可以使用公式n * (n + 1) * mul / 2来计算范围mul0...n的所有倍数的总和。然后,您只需添加35的倍数之和并减去15的倍数来解决案例:

def sum_multiples(num, mul):
    n = num / mul
    return n * (n + 1) * mul / 2

for _ in xrange(int(raw_input())):
    num = int(raw_input()) - 1
    print sum_multiples(num, 3) + sum_multiples(num, 5) - sum_multiples(num, 15)

答案 1 :(得分:0)

答案是完全正确的问题是超时。 要计算10000次迭代,复杂度应该是最小的。 您程序的复杂度为O(n * n)

以下程序的复杂度为O(n)

t=int(input())
def ar(x):
    return x*(x+1);
for i in range(t):
    n =int(input())
    n -=1;
    a=int(n/3);
    b=int(n/5);
    c=int(n/15);
    print(int(int(3*ar(a) + 5*ar(b) - 15*ar(c))>>1));

有关更多详细说明,您可以查看我的博客Learnlikepro.com