Calcular la suma entre los numero en el rango de 1 hasta N (1,N)

Calcular la suma entre los numero en el rango de 1 hasta N (1,N)

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

InputRangoOperacionSuma
-3-3, -2, -1, 0, 1-3 + -2 + -1 + 0 + 1-5
51, 2, 3, 4, 51 + 2 + 3 + 4 + 515
-1-1, 0, 1-1 + 0 + 10

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ónisum
1-3-3
2-2-5
3-1-6
40-6
51-5

Ahora prestemos atencion a un input muy parecido, pero con signo positivo:


Input N = 3


Iteraciónisum
111
223
336

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!


Master

Professional Title

Reactions

1

0

0

0

Access hereTo be able to comment

TheWhiteCode.com is not the creator or owner of the images shown, references are: