Sigueme en Twitter
«Anterior | Siguiente»

El Proyecto Euler: Problema 5

16/02/2009

El Proyecto Euler es una serie de problemas de programación, si quieres enterarte de que va esto, lee la introducción.

Problema 5

Espero que Michoacano y los señores de Kobol me pueda perdonar, pero seguiré con la regla de «un minuto» para llegar a los problemas retadores en que ya no es posible las soluciones de fuerza bruta. Los siguientes dos son sencillos de resolver sino te pones a tratar de optimizarlos, pero el 7 me llamó la atención porque trata de nuevo de números primos y ese si trataré de optimizarlo. En fin, les paso de rapidito las soluciones cochinas de 5 y 6.

2520 es el número mas pequeño que puede ser dividido por cada uno de los números del 1 al 10 sin dejar residuos.

¿Cuál es el número mas pequeño perfectamente divisible -sin residuos- por todos los números del 1 al 20?

Como nos están pidiendo el mínimo común múltiplo de 20 números, la solución de fuerza bruta es bastante simple. Hacemos un bucle donde probamos número por número entre cada una de las opciones, si nos deja residuo entonces lo descartamos y vamos por el siguiente. Así hasta encontrar el indicado.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#define LIMIT 20
 
main()
{
	int flag = 1, n = 1, i;
 
	while ( flag )
	{
		n++;
 
		for ( i = 1; i <= LIMIT; i++ )
		{
			if ( (n % i) != 0 ) {
				break;
			}
 
			flag = i == LIMIT ? 0 : 1;
		}
	}
 
	printf("%d\n", n);
	return 0;
}

Mejoras

Muchísimas.

Leí que se pueden sacar los factores primos de cada unos de los números de 1 al 20 y entonces el producto de ellos nos daría el resultado. Hacer eso sería una solución mucho -pero mucho- mas rápida y mejor que esta.


Hay 3 comentarios:

  1. 16/02/2009El Proyecto Euler | Pablasso dice:

    [...] Problema 5 – ¿Cuál es el número mas pequeño divisible por cada uno de los números del 1 al 20? «Anterior | Siguiente» Temas SimilaresEl Proyecto Euler: Problema 3 [...]

  2. 18/05/2009DAVID dice:

    por favor les pido una colaboracion, este punto no lo entiendo muy bien y para completar este codigo no me funciona, parece que se queda en un ciclo infinito, ¡¡ alguna persona me podra ayudar a solucionar este punto !!

  3. 20/05/2009blacktorta dice:

    MM bueno de lo que comentas te pongo el ejemplo.
    1*2*3*5*7=210 el 210 es divisible entre todos bueno ahora falta los demas 4,8,9 (6 es producto de 2*3 y 10 =2*5 ) por lo que necesito un 4 =2*2 para 4 y 8 un 3 para 9 nos queda
    1*2*2*2*3*3*5*7=2520 o 2520=2³ *3² * 5 * 7.
    Te propongo un metodo interesante si ves la ultima ec ningun factor primo es >10 propongo un algoritmo para toda n en seudocodigo(seudopython)(tengo otras cosas que hacer).

    arreglo[]=todos los primos menores a n
    numeroresultado=1
    auxnumero=1
    i =0//contador
    while (i!=arreglo.lent()):
    auxnumero*=arreglo[i]
    if auxnumero<=n:
    numeroresultado*=arreglo[i]
    else:
    i++
    auxnumero=1
    print numeroresultado //ya es todo

Escribe tu comentario:

¿Escribiste código? [+]

Para hacerlo más legible puedes utilizar la etiqueta <pre>.
Ejemplo: <pre lang="php" line="1"> código </pre>
  • El atributo lang indica el lenguaje de programación.
  • El atributo line indica desde donde comienza la numeración.


  Los mas frikis pueden suscribirse a los comentarios por RSS.