2016-01-07 58 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. –

相關問題