找不到Hackerrank中Project Euler#1的python代码的边缘情况

时间:2016-01-07 01:20:07

标签: python algorithm

对于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)

但是,当我提交此代码时,代码仅适用于示例测试用例和我能想到的任何自定义测试用例。我可以在这里找到哪些边缘案例?

2 个答案:

答案 0 :(得分:1)

我认为您不需要处理任何边缘情况,但您必须概括两个输入数字(即。35)。

multSums(n, i) + multSums(n, j) - multSums(n, i * j)

此外,如果使用2斜杠指定整数除法(python2中的默认值),则可以避免在任何地方使用int()转换。

>>> 5 // 2
2

答案 1 :(得分:0)

输入以行T开头,表示要遵循的行数。您发布的代码中没有任何内容可以说明该行。虽然你不需要使用它(因为你只是在没有输入的情况下断开),你需要跳过它;否则你将输出一个错误的结果并将剩余的结果向下移动一个。

尝试在input()循环之前添加while调用,以跳过第一行输入。