2016-01-07 41 views
0

项目欧拉#1 Python代码对于问题#1项目欧拉在hackerrank.com,这就是问题所在:找不到边缘情况在Hackerrank

如果我们列出所有低于10的自然数是倍数的3或5,我们得到图3,5,6和9,这些倍数的总和23. 查找的3或5的下方N.

输入格式
第一行的所有倍数的总和包含T表示测试用例的数量。这之后为T行,每行包含一个整数,N.

输出格式
对于每一个测试的情况下,打印表示3或5的所有倍数低于N.的整数,

限制条件:
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

使用raw_input,而不是输入。 –

+0

如果'N'是2呢? –

+0

如果'N'是2,它不应该打印任何东西,这是预期的。 –

回答

0

输入以行T开头,表示要跟随的行数。您发布的代码中没有任何内容会计占用该行。虽然你不需要使用它(因为你只是在没有更多输入的情况下破坏),你需要跳过它;否则你会输出一个错误的结果,并将其余结果向下移动一个。

尝试在您的while循环之前添加一个input()呼叫,以跳过第一行输入。

+0

谢谢!我的错误是没有仔细阅读问题。 –

1

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

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

此外,您还可以,如果你指定使用2个斜线整数除法(在python2默认)避免使用无处不在int()转换。

>>> 5 // 2 
2 
+0

这不回答这个问题,是脱离主题。 –

+0

@BiRico不是问题是否存在边缘情况以及自定义函数是否可以推广以适用于所有输入值? –

+0

这个问题的输入不是一般化的。它必须是3和5. –

相关问题