Este problema lo vi en otro Foro, pero me gustaria ampliarlo y Discutir sobre la eficiencia del codigo contra la "FORMA FACIL".
Problema
Tu tienes que proporcionar la Suma de Todos los numeros Impares contenidos en un rango de numeros dados [a,b]
Ejemplo:
a = 5
b = 10
Numeros impares en el rango [5,10] = { 5,7,9 };
Sumatoria 5 +7 + 9 = 21
Ejemplo
a = 1
b = 5
Numeros impares en el rango [1,5] = { 1,3,5 };
Sumatoria 1+3 +5 = 9
Entrada del programa:
Pueden existir multiples casos para probar, La primera Linea contiene el valor T Donde T es el numero de casos a realizar, 1 <= T <= 100000
Y seguido de T Casos, Cada Caso consiste en dos Numeros enteros a, b donde 0 <= a <=b <=10000. En dos lineas sepaadas (1 linea por numero entero)
Ejemplo de Entrada:
Código:
2
5
10
1
5
Ejemplo de salida
Código:
Caso 1: 21
Caso 2: 8
La solucion que muchos aplican es codigo:
Código
int T= 0,a = 0,b= 0,i,suma; i = 0; while(i < T) { suma = 0; while(a <= b) { if(a % 2 == 1) { suma += a; } a++; } i++; }
Sin embargo en mi punto de vista es bastante ineficiente, ya que si te dan 10000 Veces el peor de los casos de [0,10000] (Pongo 10000 y no 100000 para que no desborde el entero de 32 bits...) En dado caso tu programa ejecutaria un ciclo de 10000 * 10000 = 100'000,000
Claro que para los procesadores modernos no hay tanta direrencia entre 100, Mi aproximacion fue sacar la formula para determinar la sumaria de los impares del rango de 0 a A y del rango de 0 a B
Y En teoria solo entro al ciclo T veces:
Código
#include<stdio.h> int main() { int T= 0,a = 0,b= 0,i; int rango_a,rango_b; i = 0; while(i < T) { if(a % 2 != 0) { a-=1; } rango_a = (((a/2)*a)/2); // Suma de Impares desde 0 hasta a-1 if(b % 2 == 0) { rango_b = (((b/2)*b)/2); //Suma de Impares desde 0 hasta b } else { rango_b = ((((b+1)/2)*(b+1))/2); //Suma de Impares desde 0 hasta b } i++; } return 0; }
Consideren el siguiente archivo de Entrada 10000 veces rangos de [0,10000]
http://pastebin.com/raw/nK0xQ6cz