Ejercicio de algritmos en C++
El siguiente ejercicio consiste en encontrar la suma de los números , en un rango desde 1 hasta el número dado (input N), es decir: se deben sumar todos los números en ese rango dado:
Ejemplo
Input | Rango | Operacion | Suma |
---|---|---|---|
-3 | -3, -2, -1, 0, 1 | -3 + -2 + -1 + 0 + 1 | -5 |
5 | 1, 2, 3, 4, 5 | 1 + 2 + 3 + 4 + 5 | 15 |
-1 | -1, 0, 1 | -1 + 0 + 1 | 0 |
Condiciones
- El ejercicio especifica que el input no debe ser mayor a 10000
- Todos los números ingresados son numeros enteros
- El algoritmo debe aceptar tanto números negativos como positivos
- En los dos casos, sea el input N negativo o positivo, la suma siempre debe ser desde 1 hasta N
- El tiempo límite de ejecución debe ser maximo 2.0 segundos.
- El uso de memoria debe ser maximo 64MB
Resolviendo el ejercicio
La idea
general es desarrollar una suma de enteros desde un Rango (A,B)
, donde los
limites sean determinados por el input N del usuario.
La primera
solución sería usar un loop
, el cual iría desde el valor A, hasta el valor
B y en cada iteración sumaria cada valor a la suma general. Debido a que también
se podrían ingresar números negativos, la suma debe comportarse de acuerdo con
el signo de cada sumando.
Es decir:
si el usuario ingresara el número 5, el loop
podría ir desde i = 1
hasta i <=
5
sumando cada vez el valor de i:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | void calcularSumaHasta(int n){ int i = 1; int sum; int end = 0; while(i <= end){ sum += i; i++; } } int main(){ int n; cin >> n; calcularSumaHasta(n); } |
Sin embargo,
esta solución solo serviría en caso de que el numero ingresado sea mayor a 0, ósea
un numero positivo, puesto que, si procedemos con números negativos, nuestro
final (End
) seria negativo y el loop
no se ejecutaría nunca.
Observemos por un momento los posibles resultados para un input N = -3, los cuales estarían representados en la siguiente tabla:
Input N = -3
Iteración | i | sum |
---|---|---|
1 | -3 | -3 |
2 | -2 | -5 |
3 | -1 | -6 |
4 | 0 | -6 |
5 | 1 | -5 |
Ahora prestemos atencion a un input muy parecido, pero con signo positivo:
Input N = 3
Iteración | i | sum |
---|---|---|
1 | 1 | 1 |
2 | 2 | 3 |
3 | 3 | 6 |
Las 2 ultimas iteraciones no son necesarias y la suma da un valor de 6.
Si el ejercicio tomara como punto de partida la suma desde 0 hasta N, los resultados de cada input positivo o negativo serian iguales, pero del signo contrario, es decir:
- Para un input N = 3 => sum = 6, para N = -3 => sum = -6
- Para un input N = 1 => sum = 1, para N = -1 = > sum = -1
Debido a esto, podríamos hacer una sola suma y si nuestro input N es negativo, cambiaríamos ese resultado de la suma a negativo. El loop debe correr desde 1 hasta un valor no negativo, por ello, también calculamos el valor absoluto del input y lo tomamos como nuestra variable end
Por consiguiente, nuestro código se vería de la siguiente forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | void calcularSumaHasta(int n){ int i = 1; int sum; int end = 0; bool inputNegativo = false; if(n < 0){ sum = -1; end = (n * (-1)); inputNegativo = true; } else{ sum = 0; end = n; } while(i <= end){ sum += i; i++; } if(inputNegativo){ cout<< sum *(-1) ; } else{ cout<< sum; } } int main(){ int n; cin >> n; calcularSumaHasta(n); } |
Para
cuando el input N es negativo, la suma debe comenzar desde -1, puesto que
nuestro loop solo suma hasta 0 y no hasta 1, en ele ejemplo de N = -3
,
sumariamos hasta 0 con un total de sum = 6
.
Debemos restar 1 => sum = 6 – 1 =
5
y convertir el resultado en negativo, es decir sum = 5 * (-1) = -5
.
Este
problemilla con el 0 no lo tendremos para valores mayores a 0 (positivos), de
modo que dejamos el limite End = 0
, pero la suma la comenzamos desde 0.
Para terminar,
utilizamos un boolean inputNegativo
como bandera para saber si el input ha sido
negativo y de esta manera cambiar el signo a nuestro resultado.
Consideraciones
En este ejercicio hemos utilizado la estrategia de descomponer el problema general en problemas más pequeños (Divide and Conquer), hasta moldear el problema en un problema ya conocido y a partir de este, solucionar el problema general.
¿Te ha gustado el desarrollo de este ejercicio?
¿Quisieras más publicaciones como esta?
¡Coméntanos
tus dudas y dinos que podríamos haber hecho mejor!, tal vez tengas una solución
más sencilla a este ejercicio, ¡enséñanosla!
Por cierto, ¿aun no estas registrado en Thewhitecode.com?, crea ahora tu perfil
y no te pierdas de nada!