2012-10-11 58 views
9

我需要編寫一個計算所有數字n之和的函數。所有數字之和

Row 1:   1 
Row 2:   2 3 
Row 3:  4 5 6 
Row 4:  7 8 9 10 
Row 5:  11 12 13 14 15 
Row 6: 16 17 18 19 20 21 

它有助於將上述行想象爲一個「數字三角形」。函數應該帶有一個數字n,它表示有多少個數字以及使用哪一行。第5行的總和是65.我如何讓我的函數對任何n值進行這種計算?

爲了清楚起見,這不是作業。這是在最近的中期,不用說,我很難過。

+4

提示:看各行的最左邊的數字規律? 1,2,4,7,11,16,... – Junuxx

+1

http://oeis.org/A006003 – OrangeDog

回答

14

第5列最左邊的數字是11 = (4+3+2+1)+1,即sum(range(5))+1。這通常對於任何n都是正確的。

所以:

def triangle_sum(n): 
    start = sum(range(n))+1 
    return sum(range(start,start+n)) 

正如一堆人指出的那樣,你可以表達sum(range(n))分析爲n*(n-1)//2所以這可能是稍微更優雅的完成:

def triangle_sum(n): 
    start = n*(n-1)//2+1 
    return sum(range(start,start+n)) 
+1

我會說第二個版本實際上稍微*少*優雅,但稍微*更*高效。 – fletom

+0

+1不錯的解決方案。 –

2

數字1,3,6,10等被稱爲三角號碼並有一個確定的進程。只需計算兩個三角形邊界數字,使用range()可以從兩個三角形數字中獲取相應行中的數字,並使用sum()即可。

0
def sum_row(n): 
    final = n*(n+1)/2 
    start = final - n 
    return final*(final+1)/2 - start*(start+1)/2 

或者可能

def sum_row(n): 
    final = n*(n+1)/2 
    return sum((final - i) for i in range(n)) 

它是如何工作:

的第一件事,該函數可以是計算每個行中的最後一個號碼。對於n = 5,它返回15.它爲什麼有效?因爲每一行都會使行右邊的數字增加一行;起初你有1;那麼1 + 2 = 3;那麼3 + 3 = 6;然後6 + 4 = 10,等等。這就意味着你只是計算1 + 2 + 3 + .. + n,對於一個着名的公式,它等於n(n + 1)/ 2。

然後你可以總結數字從最後到最終 - n + 1(一個簡單的for循環將起作用,或者像花式的東西一樣列表理解) 或者總結所有的數字從1到最終,然後減去總和從1到最後的數字 - n,就像我在所示公式中所做的那樣;你可以用一些數學運算做得更好

0

這裏是一個通用的解決方案:

start=1 
n=5 
for i in range(n): 
    start += len (range(i)) 
answer=sum(range(start,start+n)) 

作爲一個功能:

def trio(n): 
    start=1 
    for i in range(n): 
      start += len (range(i)) 
    answer=sum(range(start,start+n)) 
    return answer 
4

使用的公式,但一個解決方案的一些工作,以達到那個等式。

def sumRow(n): 
    return (n**3+n)/2 
+1

最好的我能想到的 –

+0

我認爲沒有必要把'轉換成雙倍於回到int'的想法,因爲n ** 3和n將總是具有相同的奇偶性,因此它們的總和總是偶數。你可以簡單地用'return(n ** 3 + n)/ 2'來代替。 – elias

+0

@elias我相信你是對的。我不知道爲什麼我認爲我必須先轉換成雙。 – Matt

0
def compute(n): 
    first = n * (n - 1)/2 + 1 
    last = first + n - 1 
    return sum(xrange(first, last + 1)) 
相關問題