;

Full width home advertisement

Tutoriales

Programación

Post Page Advertisement [Top]

Este es el problema numero 1  del proyecto euler, que dice así:

Problem 1
If 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 deseamos
int 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

Bottom Ad [Post Page]

| Designed by Colorlib