对于hackerrank.com中Project Euler的问题#1,这就是问题所在:
如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9.这些倍数的总和是23。 找出N之下所有3或5的倍数之和。
输入格式
第一行包含表示测试用例数的T.接下来是T行,每行包含一个整数N。
输出格式
对于每个测试用例,打印一个整数,表示N的所有倍数为3或5的总和。
约束:
1≤T≤105
1≤N≤109
def multSums(num, div):
hiMult = int( (num-1)/ div )
return int(div * hiMult * ( hiMult + 1 ) / 2)
while True:
try:
n = int(input())
except EOFError:
break
result = multSums(n, 3) + multSums(n, 5) - multSums(n, 15)
if result > 0:
print(result)
对于这个问题,如果我使用列表推导来获得所有的倍数,我会失败测试用例,因为它需要太长时间。相反,我递减了数字(所有倍数低于N),将数字除以div
(3,5,15),并使用求和公式对连续数字hiMult * ( hiMult + 1 ) / 2
求和,并使用结果乘以div
。我需要使用15
删除重复的倍数:结果为multSums(n, 3) + multSums(n, 5) - multSums(n, 15)
。
但是,当我提交此代码时,代码仅适用于示例测试用例和我能想到的任何自定义测试用例。我可以在这里找到哪些边缘案例?
答案 0 :(得分:1)
我认为您不需要处理任何边缘情况,但您必须概括两个输入数字(即。3
和5
)。
multSums(n, i) + multSums(n, j) - multSums(n, i * j)
此外,如果使用2斜杠指定整数除法(python2中的默认值),则可以避免在任何地方使用int()
转换。
>>> 5 // 2
2
答案 1 :(得分:0)
输入以行T
开头,表示要遵循的行数。您发布的代码中没有任何内容可以说明该行。虽然你不需要使用它(因为你只是在没有输入的情况下断开),你需要跳过它;否则你将输出一个错误的结果并将剩余的结果向下移动一个。
尝试在input()
循环之前添加while
调用,以跳过第一行输入。