这段代码有什么问题?它没有通过案例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
答案 0 :(得分:0)
代码有几个问题。首先,因为你正在使用long
我想你是在Python 2上运行它。在Python 2上range
将生成一个list
,因为问题描述状态你将耗尽内存最高N
为10^9
。您可以通过切换到返回xrange
的xrange object来解决该问题。
如果您进行上述更改,第二个问题就是速度。由于最大N
为10^5
,您可能需要迭代10^14
个数字,这需要太长时间。为了修复所使用的算法需要改变。您可以使用公式n * (n + 1) * mul / 2
来计算范围mul
中0...n
的所有倍数的总和。然后,您只需添加3
和5
的倍数之和并减去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