2012-10-11 19 views
9

Ho bisogno di scrivere una funzione che calcoli la somma di tutti i numeri n.Somma di tutti i numeri

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 

È utile immaginare le righe precedenti come un "triangolo numerico". La funzione dovrebbe prendere un numero, n, che indica quanti numeri e quale riga usare. La somma della riga 5 è 65. Come potrei ottenere la mia funzione per eseguire questo calcolo per ogni valore n?

Per motivi di chiarezza, questo non è compito. Era su un periodo intermedio e, inutile dire, ero perplesso.

+4

suggerimento: vedere la regolarità del numero più a sinistra di ogni riga? 1,2,4,7,11,16, ... – Junuxx

+1

http://oeis.org/A006003 – OrangeDog

risposta

14

Il numero più a sinistra nella colonna 5 è 11 = (4+3+2+1)+1 che è sum(range(5))+1. Questo è generalmente vero per qualsiasi n.

Quindi:

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

Come notato da un gruppo di persone, è possibile esprimere sum(range(n)) analiticamente come n*(n-1)//2 quindi questo potrebbe essere fatto anche un po 'più elegante da:

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

Direi che la seconda versione è in realtà leggermente * meno * elegante, ma leggermente * più * efficiente. – fletom

+0

+1 bella soluzione. –

2

I numeri 1, 3, 6, 10, ecc. Si chiamano numeri di triangolo e hanno una progressione definita. Calcolare semplicemente i due numeri del triangolo di delimitazione, utilizzare range() per ottenere i numeri nella riga appropriata da entrambi i numeri di triangolo e sum().

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

o forse

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

Come funziona:

La prima cosa che la funzione fa è per calcolare l'ultimo numero in ogni riga. Per n = 5, restituisce 15. Perché funziona? Poiché ogni riga incrementa il numero a destra del numero della riga; all'inizio hai 1; quindi 1 + 2 = 3; poi 3 + 3 = 6; poi 6 + 4 = 10, ecc. Questo impone che stai semplicemente calcolando 1 + 2 + 3 + .. + n, che è uguale a n (n + 1)/2 per una famosa formula.

quindi è possibile sommare i numeri dalla finale alla finale - n + 1 (un ciclo for semplice funzionerà, o cose di fantasia come la lista) o sommare tutti i numeri da 1 a finale e quindi sottrarre la somma di i numeri da 1 a finale - n, come ho fatto nella formula mostrata; si può fare meglio con alcune operazioni matematiche

0

Ecco una soluzione generica:

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

In funzione:

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

una soluzione che utilizza un'equazione, ma è un po 'di lavoro per arrivare a questa equazione.

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

meglio che potessi pensare a –

+0

Penso che non sia necessario per la conversione 'raddoppiare che tornare a int'-idea, dato che n ** 3 e n avranno sempre la stessa parità, quindi la loro somma è sempre pari. Puoi semplicemente semplicemente 'return (n ** 3 + n)/2' invece. – elias

+0

@elias Credo che tu abbia ragione. Non sono sicuro del motivo per cui ho pensato di dover convertire prima il doppio. – Matt

0
def compute(n): 
    first = n * (n - 1)/2 + 1 
    last = first + n - 1 
    return sum(xrange(first, last + 1)) 
Problemi correlati