Problema de rango en C# (Parseando)

Iniciado por DarK_FirefoX, 26 Junio 2012, 16:24 PM

0 Miembros y 1 Visitante están viendo este tema.

DarK_FirefoX

Hola, tengo un pequeño problema en C#, tengo que dar solucion a un problema donde me entran un numero n tal que n esta entre 0 y 10000, no es divisible por 2 ni por 5. Tengo que ir dividiendo 1/n y ver si es divisible si no divido 11/n y si no 111/n hasta xCantidadDe1/n hasta que sea divisible por n. Luego debo devolver la cantidad de 1s. Lo que me pasa es que si el numero de uno es muy grande se me sale del rango de cualquier tipo de datos de .NET. Probe con string, pero igual tengo que Parsearlo.

Aqui les dejo el codigo que tengo hecho, si pueden corregirme y ayudarme y explicarme les estaria agradecidos.

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                string numero = Console.ReadLine();
                string ones = "1";
                double a = double.Parse(numero);
                if (a == 0) break;
                while (double.Parse(ones) % a != 0)
                {
                    ones += "1";
                }
                Console.WriteLine(ones.Length);
            }
        }
    }
}

Salu2s..:Gracias de antemano.

Pablo Videla

Pero ahi yo veo que estas haciendo eso infinitamente, así obviamente se saldrán del rango... colocale limites a ese ciclo

DarK_FirefoX

#2
¿Que ciclo esta infinito?.....

El while(true) termina cuando a==0
y el  while (double.Parse(ones) % a != 0) cuando la variable ones/a tenga resto 0

aqui actualizo el codigo.... cambiando una mejor manera de cambiar los parser

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                string numero = Console.ReadLine();
                if (numero == null || numero.Contains(' ') || numero=="") break;
                long ones = 1;
                int potencia = 1;
                long a = long.Parse(numero);
                if (a == 0) break;
                while (ones % a != 0)
                {
                    ones += (long)Math.Pow(10, potencia);
                    potencia++;
                }
                Console.WriteLine(ones.ToString().Length);
            }
        }
    }
}

Pablo Videla

#3
Cita de: DarK_FirefoX en 26 Junio 2012, 16:52 PM
¿Que ciclo esta infinito?.....

El while(true) termina cuando a==0
y el  while (double.Parse(ones) % a != 0) cuando la variable ones/a tenga resto 0

aqui actualizo el codigo.... cambiando una mejor manera de cambiar los parser

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
   class Program
   {
       static void Main(string[] args)
       {
           while (true)
           {
               Double numero = Double.Parse(Console.ReadLine());
               //if (numero == null || numero.Contains(' ') || numero=="") break;
               Double ones = 1;
               Double potencia = 1;
       
               if (numero == 0) break;
               while (ones % numero != 0)
               {
                   ones += (Double)Math.Pow(10, potencia);
                   potencia++;
               }
               Console.WriteLine(ones.ToString().Length);
           }
       }
   }
}



Dame el error exacto y cuando se produce y si te lanza en la linea muestranos cual es, mientras mas informacion haya mas personas podriamos intentar ayudarte.

PD: Intenta con los cambios que hice.
PD2: no me habia dado cuenta del detalle, no ando con el visual studio a mano , pero intentare darte ideas xD

A todo esto, en que momento será 0 el numero?

DarK_FirefoX

Con double tampoco funciona, imaginate que tengo un ejemplo con el numero 589 que da 90 unos. y el double no tiene un rango de 90 cifras, no obstante, ya lo resolvi...aqui dejo el codigo...

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ones
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                string numero = Console.ReadLine();
                if (string.IsNullOrWhiteSpace(numero) || numero == "0") return;
                Console.WriteLine(Mult(numero));
            }
        }
        public static int Mult(string s)
        {
            int a = int.Parse(s);
            long ones = 0;
            int potencia = 0;
            ones += (long)Math.Pow(10, potencia);
            while (ones % a != 0)
            {
                potencia++;
                ones += (long)Math.Pow(10, potencia);
            }
            return ones.ToString().Length;
        }
    }
}


Muchas gracias....

PD: Tengo que comprobar si es null o vacio porque el .cs lo subo en un probador que trabaja automaticamente y prueba n casos