jueves, 9 de febrero de 2012

Project Euler - 26

Bueno aquí mi primer código para el blog es el problema 26 de projecteuler.net , por pensar en resolverlo rápido tarde 3 días en darme cuenta de que solo era aplicar lo que nos enseñan en primaria, creo que aprendí una gran lección:"No todos los problemas tienen que tener soluciones largas y complicadas."
#include <iostream>

using namespace std;

bool esPeriodico(int n)
{
    while((n&1)==0) n >>= 1;

    while(n%5==0) n /= 5;

    if(n!=1)
        return true;
    return false;
}
int cantidad(int divisor)
{
    int restos[10000]= {0};
    bool pasados[10000]= {0};
    int pos = 1;
    int contador = 0;
    int dividendo;
    restos[0] = 10;
    dividendo = 10;
    while(!pasados[dividendo])
    {
        pasados[dividendo] =  true;
        restos[pos++] = dividendo;
        while(dividendo < divisor)
        {
            dividendo *= 10;
            pasados[dividendo] =  true;
            restos[pos++] = dividendo;
            contador++;
        }
        dividendo =(dividendo%divisor)*10;
        restos[pos++] = dividendo;
        contador++;
    }
    int i = 0;
    while(restos[i]!=dividendo && i < 10000)
        i++;
    if(i<pos)
        return (contador-i+1);
    return contador;
}
int main()
{
    int max , d,aux;
    for(int i = 3; i<=1000; i++)
        if(esPeriodico(i))
        {
            aux = cantidad(i);
            if(aux>max)
            {
                max = aux;
                d = i;
            }
        }
    cout << "El d con el ciclo mas grande es " << d << " con un ciclo de "<<max<< endl;
    return 0;
}

No hay comentarios:

Publicar un comentario