2012-10-11 26 views
9

Potrzebuję napisać funkcję, która oblicza sumę wszystkich liczb n.Suma wszystkich liczb

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 

Pomaga wyobrazić sobie powyższe wiersze jako "trójkąt liczbowy". Funkcja powinna przyjmować liczbę, n, co oznacza liczbę liczb oraz wiersz, którego należy użyć. Suma w wierszu 5 to 65. W jaki sposób uzyskałabym funkcję wykonywania tego obliczenia dla dowolnej wartości n?

Dla jasności, to nie jest praca domowa. To było na ostatnim semestrze i nie muszę dodawać, że byłem zakłopotany.

+4

Podpowiedź: patrz prawidłowości w skrajnej lewej liczb każdego wiersza? 1,2,4,7,11,16, ... – Junuxx

+1

http://oeis.org/A006003 – OrangeDog

Odpowiedz

14

Najbardziej wysunięta na lewo liczba w kolumnie 5 to 11 = (4+3+2+1)+1, która jest sum(range(5))+1. Jest to generalnie prawdziwe dla każdego n.

Więc:

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

Jak zauważył kilka osób, można wyrazić sum(range(n)) analitycznie jako n*(n-1)//2 więc można to zrobić nawet nieco bardziej elegancko przez:

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

Powiedziałbym, że druga wersja jest właściwie nieco * mniej * elegancka, ale nieco * bardziej * efektywna. – fletom

+0

+ 1 fajne rozwiązanie. –

2

Numery 1, 3, 6, 10 itd. Nazywane są numery trójkątów i mają określony postęp. Po prostu obliczyć dwa numery trójkąta ograniczającego, użyj range(), aby uzyskać liczby w odpowiednim wierszu z obu liczb trójkątów i sum() je.

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

lub może

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

Jak to działa:

Pierwszą rzeczą, że funkcja nie jest obliczenie ostatni numer w każdym rzędzie. W przypadku n = 5 zwraca wartość 15. Dlaczego to działa? Ponieważ każdy rząd zwiększa numer po prawej o numer wiersza; najpierw masz 1; następnie 1 + 2 = 3; następnie 3 + 3 = 6; następnie 6 + 4 = 10, ecc. To oznacza, że ​​po prostu obliczasz 1 + 2 + 3 + .. + n, co równa się n (n + 1)/2 dla słynnej formuły.

następnie możesz zsumować liczby od ostatecznego do ostatecznego - n + 1 (prosta pętla będzie działać, lub może wymyślne rzeczy, takie jak zrozumienie listy) Lub zsumować wszystkie liczby od 1 do ostatecznego, a następnie odjąć sumę liczby od 1 do końcowej - n, tak jak w przedstawionym wzorze; można to zrobić lepiej z niektórych operacji matematycznych

0

Oto ogólny rozwiązanie:

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

Jako funkcję:

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

Rozwiązanie, które wykorzystuje się równanie, ale jest to trochę pracy, aby dojść do tego równania.

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

najlepsze, jakie mogłem wymyślić –

+0

Myślę, że nie ma potrzeby "konwersji na podwójny niż powrót do int", ponieważ n ** 3 i n zawsze będą miały taką samą parzystość, a więc ich suma jest zawsze równa. Możesz zamiast tego po prostu "return (n ** 3 + n)/2". – elias

+0

@elias Wierzę, że masz rację. Nie jestem pewien, dlaczego pomyślałem, że muszę się najpierw nawrócić. – Matt

0
def compute(n): 
    first = n * (n - 1)/2 + 1 
    last = first + n - 1 
    return sum(xrange(first, last + 1)) 
Powiązane problemy