Este es el problema numero 1 del proyecto euler, que dice así:
Problem 1If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.Find the sum of all the multiples of 3 or 5 below 1000.
El problema es sencillo, es hallar la sumatoria de los numero que sean divisible entre 3 y 5 que esten por debajo de 1000.
El codigo en C/ C++ hecho a Fuerza bruta:
#include <stdio.h> #include <string.h> #include <stdlib.h> #pragma hdrstop void main(){ int suma = 0; // variable donde guardamos la sumatoria int fin = 1000; // Fin sera la variable que tendra el valor hasta donde queramos que llegue la sumatoria for(int i = 3; i < fin ; i++){ if( i % 3== 0 || i % 5 == 0){ suma+= i; } }//fin for printf(“%d”, suma); }//main
Ejecutando el codigo anterior la respuesta da : 233168.
Pero se puede optimizar el proceso de calculo eliminando la necesidad de usar ciclos utilizando la siguiente formula:
X siendo el limite de la sumatoria.
N siendo el numero con el cual queremos dividir.
Suma = ( N/2 ) * ( ( X-1) / N) * ( (X+2) / N).
como en el código siguiente:
int X= 1000; //sera la variable que tendra el valor hasta donde queramos que llegue la sumatoria int suma_tres = 1.5*(int)((x-1)/3)*(int)((x+2)/3) ; // se halla la suma de lo divisibles de tres int suma_cinco= 2.5*(int)((x-1)/5)*(int)((x+4)/5) ;// se halla la suma de lo divisibles de cinco int suma _producto = 7.5*(int)((x-1)/15)*(int)((x+14)/15); // se halla la suma de los divisibles de la multiplicacion entre 3 y 5 // el resultado int resultado = suma_tres + suma_cinco - suma_producto;
AL final a la sumatoria de tres y a la sumatoria de cinco después de sumadas se le tiene que restar la sumatoria de los productos de tres y cinco para eliminar los numeros sumados dos veces por ser divisibles tanto por tres y cinco, ejemplo: 15, 45, 60, etc…
Utilizando la formula el codigo anterior se puede reducir a una solo linea como en el siguiente ejemplo:
int resultado = 1.5*(int)((x-1)/3)*(int)((x+2)/3) + 2.5*(int)((x-1)/5)*(int)((x+4)/5) - 7.5*(int)((x-1)/15)*(int)((x+14)/15);
Pero el objetivo de todo programador es hacer codigo reutilizable, para este problema se creo una función ( ó metodo) que permita calcular la sumatoria de numeros divisibles entre un numero N que queramos hasta el limite que queramos.
// Declaración de la funcion, siendo el parametro fin el limite hasta donde que remos que llegue la sumatoria, siendo div el parámetro que contenga el numero con el cual queramos dividir.int suma_div( int fin, int div){fin—;int suma = fin / div;return ( div * ( suma * (suma +1)) ) / 2;}// se llama la funcion con los parametros que deseamosint resultado = suma_div(1000,3) + suma_div(1000,5) - suma_div(1000,15);
Listo ya tenemos una función que es capaz de retornar la sumatoria de todos los números divisibles entre un numero X de nuestra elección hasta un numero limite que queramos. Solo hay que tomar en cuenta que la variable fin se resta en uno porque segun el enunciado el limite no debe tomarse en cuenta en la sumatoria, es decir, tan solo se puede sumar hasta 999 , en caso de que quieras usar la funcion pero incluyendo el limite tan solo se tiene eliminar el la linea de codigo: “fin—”;
Tambien hay que tomar en cuenta que para numeros muy grandes es mejor trabajar con otro tipo de datos como long int, double, etc..
Cualquier opinión o comentario tan solo escribe. También tienes algún problema de programación que quieres compartir envíame el enunciado y a los días haré un programa dando la respuesta
No hay comentarios:
Publicar un comentario