martes, 17 de enero de 2012

Numeros Primos en C#

Bueno ahora vamos hacer algo muy común, Normalmente este es un ejercicio de programación que nos ayuda a comprender mejor la lógica de los problemas y comúnmente usado por los profesores, para tal enseñanza me refiero a calcular si un numero es primo o no?.

Hoy vamos hacer el programa para ver si un número ingresado por consola es primo o no.

Primero definamos el concepto de número primo:

Un numero primo es aquel numero que solo es divisible por 1 y pos si mismo, de lo contrario este número solo será un múltiplo de otro.

También cabe recordar que los números primos son Enteros y los decimales no entran en esta categoría.

Si quieres tener un mejor concepto de esto pueden ver en Wiki Numeros Primos.

Ahora en C# voy hacer  tres metodos los cuales van hacer lo mismo (Ver si el numero es primo o no), pero cada metodo va hacer mejor que el siguiente y mejor me refiero a mas optimo, bueno a qui les dejo el codigo si tienen alguna duda me comentan...=)

    class Program
    {
        
        static void Main(string[] args)
        {
            //pedimos el numero por parametro
            Console.WriteLine("Escriba el numero a identificar si es primo o no");

       //creamos la variable, convertimos el parámetro a entero ya que todo dato q pedimos entra como string

            int aux= Convert.ToInt32(Console.ReadLine());
        
  //llamamos el método que optimizamos
            verPrimo1(aux);
            verPrimo2(aux);
            verPrimo3(aux);

            Console.ReadKey();
        }

        //Este el método normal, solo veremos  hay algún numero mayor a 1 y menor q si mismo que al aplicarle el modulo "%" 
         // o si el residuo de la división es cero, esto significara que es un múltiplo de otro número y por lo tanto no es primo
         // Si con el primero no coincide ira incrementado de 1 en 1 hasta llegar a  si mismo -1
         


        public static void verPrimo1(int num) 
        {
            //una variable que identifica cuando es primo
            bool primo = false;

            //el dos es considerado como primo, por lo cual si es 2 no tendremos la necesidades meterlo en el ciclo

            if (num != 2)
            {

                //vamos hacer un ciclo, para tratar de dividir por todos los numero y determinar si es primo
                for (int i = 2; i < num; i++)
                {
                    if (num % i == 0)
                    {
                        primo = true;
                        Console.WriteLine("El numero No es primo");
                        break;
                    }
                }

            }
            //verificamos la variable en caso tal que haya recorrido y no encuentre ninguno entonces es primo
            if (!primo)
            {
                Console.WriteLine("El numero es primo");
            }
        }


        /*lo que se hará en este método es verificar si el número es primo, Pero optimizando la manera en cómo se busca
        *Si observamos el código anterior nos damos cuenta que se tiene que de 1 en 1 hasta encontrar el indicado en este método vamos a variar
        *ahora vamos a ir solo hasta la mitad del número, debido  a que por lógica la mitad superior es múltiplo de la mitad inferior
        * si solo comparamos con la mitad inferior mas 1 sería más que suficiente.*/

        public static void verPrimo2(int num)
        {
            bool primo = false;

            if (num != 2)
            {

                //vamos hacer un ciclo, para tratar de dividir por todos los numero y determinar si es primo
                for (int i = 2; i < (num/2)+1 ; i++)
                {
                    if (num % i == 0)
                    {
                        primo = true;
                        Console.WriteLine("El numero No es primo");
                        break;
                    }
                }

            }
            //verificamos la variable en caso tal que haya recorrido y no encuentre ninguno entonces es primo

            if (!primo)
            {
                Console.WriteLine("El numero es primo");
            }

        }

        //lo que aremos en esta optimización es debido a q todos los números Primos son impares entonces ya no tendremos que ir de 1 en 1
        // aremos solo q divida entre impares empezando en 1  pero sin tener efecto e ir incrementándolo de dos en dos


        public static void verPrimo3(int num)
        {
            bool primo = false;

            if (num != 2)
            {

                //vamos hacer un ciclo, para tratar de dividir por todos los numero y determinar si es primo
                for (int i = 1; i < (num / 2) + 1; i=i+2)
                {
                    if (i != 1)
                    {
                      if (num % i == 0)
                         {
                             primo = true;
                             Console.WriteLine("El numero No es primo");
                             break;
                         }
                    }
                }

            }
            //verificamos la variable en caso tal que halla recorrido y no encuentre ninguno entonces es primo
            if (!primo)
            {
                Console.WriteLine("El numero es primo");
            }

        }
    }

8 comentarios:

  1. Excelente!. Me ha ayudado mucho!.
    En hora buena, gracias.

    ResponderEliminar
  2. Gracias amigo, me ha sido de muchisima ayuda.

    ResponderEliminar
  3. Amigo quisiera saber si este ejercicio en cualquiera de los tres metodos que hiciste es recursivo, esque no comprendo muy bien la recursividad espero tu respuesta gracias.

    ResponderEliminar
    Respuestas
    1. Hola, que pena la demora, para darte una respuesta rápida seria NO. ninguno de los métodos utilizados es recursivo. Bastimente, para que un método sea recursivo este debe buscar la solución al problema haciendo llamados a si mismo hasta que encuentre la solución. para darte un ejemplo seria como:


      static String result="";

      public static void main(String[] agrs)
      {
      Main.convertirABinario(8);
      }

      public static String convertirABinario(int numero)
      {
      //Obtenemosel binario
      int binario=numero%2;

      //Lo guardamos en el string
      result+=binario;

      //pasamos el sigiente numero
      binario=numero/2;

      //TODO Se realiza la parte recursiva, se llama a el mismo y se sigue buscando la solución
      if(numero>0)
      {
      convertirABinario(binario);
      }
      //Cuando encuentre la solución retornamos el valor.
      System.out.println(result +"\n");
      return result;
      }
      //Ejemplo JAVA

      Espero solucionar tu duda, cualquier cosa quedo atento. :)

      Eliminar
  4. Muy buena la información y si se quiere conocer los números primos de un número que se ingresa?
    como se haría?!

    ResponderEliminar
  5. Muy buena la información y si se quiere conocer los números primos de un número que se ingresa?
    como se haría?!

    ResponderEliminar
    Respuestas
    1. Si no mal entiendo, en la linea 6 está comentado
      //pedimos el numero por parametro
      int aux= Convert.ToInt32(Console.ReadLine());

      Eliminar

Alguna duda?