Proyecto Euler - Problema 1

Este es el primero de una serie de 232 problemas (que siguen creciendo) del proyecto Euler que ya presenté hace unos días.

El enunciado de este problema dice lo siguiente:

Si listamos todos los números naturales debajo de 10 que son múltiplos de 3 o 5, tenemos 3, 5, 6 y 9. La suma de estos múltiplos es 23.

Encuentra la suma de todos los múltiplos de 3 o 5 debajo de 1000.

Ahora bien, algo bastante común que podemos hacer, que es lo más lógico que nos sale a todos cuando queremos resolverlo, es recorrer todos los números hasta el 1000 e ir controlando que sean divisibles por alguno de esos numeros. Yendo al código (en C++) sería algo así:

main()
{
    int i,r=0;
    for(i; i < 1000; i++){
       if( (i%3==0) || (i%5==0) ){
              r = r + i;
       }
    }
    printf("%d",r);
}

Eso pedaso de código funciona genial y resuelve el problema, pero yo quiero tratar de buscarle otras formas de resolverlo.

Cuando estaba analizando cada número de los que son multiplos de 3 o 5, me encontre con un patron de distancia entre números. Todos los números estan separados por esta serie que se repite por siempre: {3,2,1,3,1,2,3}.

Teniendo esas distancia entre números no hace falta controlar si es o no divisor, solo sumanos y nada más. Es decir: 0+3=3, 3+2=5, 5+1=6, 6+3=9, 9+1=10, 10+2=12, 12+3=15. Los resultados de cada una de estas pequeñas sumas, son esos multiplos de 3 y 5.Y así sigue.

El resultado, podría ser algo así:

main()
{
    int patron[7] = {3,2,1,3,1,2,3};
    int result=0, x=0;
    for(int i=0; i < 1000; i+=patron[x-1] ){
        result += i;
        x = (x==7)? 1 : x+1;
    }
    printf("%d",result);
}

Seguramente, habra formas mas lindas de escribir ese código, pero como ya dije, lo que me gusta de esto es jugar con los números y las cuentas, no tanto si un for es o no más rapido que un while.

Escucho alternativas con gusto!

Conclusión

main()
{
    int patron[7] = {3,2,1,3,1,2,3};
    int result=0, x=0;
    for(int i=0, x=0; i < 1000; i += patron[x], x = (x==6)? 0 : x+1)
       result += i;
    printf("%d\n",result);
}

Entradas Relacionadas


Acerca de esta entrada

Dreamhost Text Link Ads ThemeForest Rentabiliza tu sitio!