2012-10-11 51 views
9

Necesito escribir una función que calcule la suma de todos los números n.Suma de todos los números

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 

Ayuda a imaginar las filas anteriores como un 'triángulo numérico'. La función debe tomar un número, n, que denota cuántos números y qué fila usar. La suma de la fila 5 es 65. ¿Cómo obtendría mi función para hacer este cálculo para cualquier n-valor?

En aras de la claridad, esto no es tarea. Fue en un punto intermedio reciente y no hace falta decir que estaba perplejo.

+4

Sugerencia: ver la regularidad en los números más a la izquierda de cada fila? 1,2,4,7,11,16, ... – Junuxx

+1

http://oeis.org/A006003 – OrangeDog

Respuesta

14

El número más a la izquierda en la columna 5 es 11 = (4+3+2+1)+1 que es sum(range(5))+1. Esto es generalmente cierto para cualquier n.

Así:

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

Como se ha señalado por un grupo de personas, puede expresar sum(range(n)) analíticamente como n*(n-1)//2 por lo que este se podría hacer incluso un poco más elegante por:

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

Diría que la segunda versión es en realidad un poco * menos * elegante, pero ligeramente * más * eficiente. – fletom

+0

+1 buena solución. –

2

Los números 1, 3, 6, 10, etc. se llaman números de triángulo y tienen una progresión definida. Simplemente calcule los dos números del triángulo delimitador, use range() para obtener los números en la fila correspondiente de ambos números de triángulo y sum().

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

o tal vez

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

¿Cómo funciona:

Lo primero que hace es la función para calcular el último número en cada fila. Para n = 5, devuelve 15. ¿Por qué funciona? Debido a que cada fila incrementa el número a la derecha por el número de la fila; al principio tienes 1; luego 1 + 2 = 3; luego 3 + 3 = 6; luego 6 + 4 = 10, ecc. Esto implica que simplemente estás calculando 1 + 2 + 3 + .. + n, que es igual a n (n + 1)/2 para una fórmula famosa.

luego puede sumar los números de final a final - n + 1 (un bucle simple funcionará, o tal vez cosas de lujo como la comprensión de lista) O sume todos los números del 1 al final y luego reste la suma de los números del 1 al final - n, como hice en la fórmula que se muestra; se puede hacer mejor con algunas operaciones matemáticas

0

Aquí es una solución genérica:

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

En función:

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

una solución que utiliza una ecuación, pero es un poco de trabajo para llegar a esa ecuación.

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

mejor podría pensar en –

+0

Creo que no hay necesidad de la 'conversión a doble' que volver a la idea-int, ya que n ** 3 yn siempre tendrán la misma paridad, por lo tanto, su suma siempre será pareja. Simplemente puede 'devolver (n ** 3 + n)/2' en su lugar. – elias

+0

@elias Creo que tienes razón. No estoy seguro de por qué pensé que tenía que convertir para doblar primero. – Matt

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