Estoy tratando de encontrar el número cero-uno más pequeño (un número que se compone solo de ceros y unos, es decir, 11001) que es un múltiplo del número ingresado a través de STDIN, pero el programa se bloquea cuando ingreso 99999, y este es uno de los casos de prueba que deberían funcionar ya que el valor de entrada debería oscilar entre 1 y 100000, el programa se bloquea en ulong.Parse (binario); en Getmultiple (ulong n).

¿Qué cambio debo hacer para que funcione?

class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            string s = Console.ReadLine();

            ulong l;
            ulong.TryParse(s, out l);

            Console.WriteLine(Getmultiple(l));
        }
    }

    private static ulong Getmultiple(ulong n)
    {

        for (ulong i = 1; ; i++)
        {
            String binary = Convert.ToString((long) i, 2);

            ulong no = ulong.Parse(binary);

            if (no % n == 0)
            {
                return no;
            }
        }

    }

}

MENSAJE DE ERROR:

Se produjo una excepción no controlada del tipo 'System.OverflowException' en mscorlib.dll

Información adicional: el valor era demasiado grande o demasiado pequeño para UInt64.

0
Ashvin Bhuttoo 26 ene. 2016 a las 20:49

3 respuestas

La mejor respuesta

Está desbordando la variable larga sin firmar, lo que significa que no hay un múltiplo de 99999 que se ajuste a sus requisitos que también sea menor que 2 ^ 64. Si refactoriza su código para usar BigInteger en lugar de unsigned long, entonces no tendrás el problema de desbordamiento. Sin embargo, es posible que su algoritmo tarde un poco en encontrar la solución ...

También haría este cambio, para comprobar la cordura su entrada:

BigInteger l;
if(BigInteger.TryParse(s, out l))
    Console.WriteLine(Getmultiple(l));
else
    Console.WriteLine("Not a valid integer");
0
Esoteric Screen Name 26 ene. 2016 a las 19:09

¡Usar BigInteger funciona! Algunos casos de prueba que fallaron con ulong ahora están funcionando, ¡gracias Esoteric Screen Name!

    static void Main(string[] args)
    {
        while (true)
        {
            string s = Console.ReadLine();

            BigInteger l;
            if (BigInteger.TryParse(s, out l))
                Console.WriteLine(Getmultiple(l));
            else
                Console.WriteLine("Not a valid integer");
        }
    }

    private static BigInteger Getmultiple(BigInteger n)
    {

        for (BigInteger i = 1; ; i++)
        {
            String binary = Convert.ToString((long) i, 2);

            BigInteger no = BigInteger.Parse(binary);

            if (no % n == 0)
            {
                return no;
            }
        }

    }
0
Ashvin Bhuttoo 26 ene. 2016 a las 19:42

Parece que está obteniendo un número demasiado grande para ulong no, puede usar ulong.TryParse para evitarlo.

    private static ulong Getmultiple(ulong n)
    {

        for (ulong i = 1; ; i++)
        {
            String binary = Convert.ToString((long)i,2);

            ulong no = 0;

            if (ulong.TryParse(binary,out no))
            {

                if (no % n == 0)
                {
                    return no;
                }
            }
            else
            {
                return 0;
            }
        }

    }

Elegí devolver 0 para un resultado no válido.

0
Gilgamesh 26 ene. 2016 a las 18:06