Saber si un número es primo o no

Anteriormente vimos como imprimir los números primos en un rango determinado por el usuario, ahora la idea es pedirle al usuario un número y decirle si es primo o no es primo.

#include<iostream>
using namespace std;

int main()
{
  int num,c,res,nc=0;
  cout<<"Introduce un número: "; cin>>num;
  for(c=1;c<=num;c++)
  {
    res=num%c;
    if(res==0)
      nc++;
    if(nc>2)
      break;
  }
  if(nc==2)
    cout<<"Es primo";
  else
    cout<<"No es primo";
  cin.get();cin.get();
}

En sí, es lo mismo que el anterior. Para darle mas presentación podemos hacer que no se salga a la primera, sino hasta que se introduzca, por ejemplo, un cero. Esto se hace con un ciclo do while.

#include<iostream>
using namespace std;

int main()
{
  int num=1,c,res,nc=0,rep=0;
  while(num!=0)
  {
    cout<<"Introduce un número: ";
    if(rep==1)
    {
      cout<<" --> Para salir oprime cero: ";
    }
    rep++;
    cin>>num;
    for(c=1;c<=num;c++)
    {
      res=num%c;
      if(res==0)
        nc++;
    }
    if(nc==2)
      cout<<"Es primonn";
    else
      cout<<"No es primonn";
    nc=0;
  }
}

¿Alguien sabe porqué la variable num empieza en 1 en este caso?

48 thoughts on “Saber si un número es primo o no

  1. Muchas gracias por tu gran trabajo, quisiera saber si tambien podrías hacer dar un ejemplo para saber si un numero es primo o no pero “sin cliclos”; osea sin for y sin while solo if y else.
    Te agredecería mucho tu ayuda.

    1. Sin ciclos lo veo difícil. Para saber si un número es primo necesitamos checar si es divisible entre los números menores a él, si resulta que solo se divide entre 1 y él mismo, entonces es primo.

      Pero nada es imposible, también puedes checar solo con ifs si es divisible entre 2, luego entre 3, entre 5, 7 y 11, si en alguno de ellos el residuo es 0, no es primo, solo teniendo cuidado de no hacer la división cuando sea el mismo numero (5 y 5 por ejemplo). Pero no hay seguridad que funcione con números grandes.

      ¿Un poco confuso ese párrafo no? Mejor te contesto con un post, espéralo🙂

      1. Realmente, sería mucho más eficiente comprobar, una vez has comprobado que no es un número divisible entre 2, comprobarlo sólo si es divisible entre los números impares. Además, yo tengo hecho un programa que hace precisamente eso, y la comprobación la hago en una función que sale de ella en el momento en que ha comprobado que tiene algún divisor. Mi algoritmo también comprueba antes del ciclo si es divisible entre 3, y en el ciclo se salta los múltiplos de 3 (esto lo hice porque es parte de un programa para calcular todos los números primos del 2 al número que le indiques, y yo lo he probado hasta 50000000, para 10000000 tarda 9 segundos en mi ordenador).

      2. Otro detalle, en mi algoritmo calculo la raiz cuadrada por exceso del número a comprobar, y la pongo como límite de comprobación (si no tiene ningún divisor menor o igual a su raiz cuadrada, tampoco tiene ningún divisor superior a ella).

  2. Si hola seria bueno que alguien publicara un codigo que pasandole una cierta cantidad de cifras me mostrara un primo correspondiente, es decir entrando por ejemplo 3 me muetre “997”.

    1. Un primo es primo porque sólo se divide sin dejar residuo entre dos números: 1 y sí mismo. La variable nc cuenta cuantas veces un número se divide sin dejar residuo.

  3. ese algoritmo funciona pero es extremadamente ineficiente, además no tiene en cuenta el hecho de que no es necesario iterar entre 1 y num, una mejor alternativa seria iterar entre 1 y la raiz cuadrada de num

    1. Estoy de acuerdo que no es la mejor forma de hacerlo, pero de ahí a que sea ‘extremadamente ineficiente’ hay un salto muy grande. Además de que el público para el que está diseñado este blog son personas ‘no muy expertas’ en programación que busca ayuda para hacer sus tareas.

      1. x supuesto ps practikamente soy principiante en c++ y ps eto si q me es d mucha ayuda gracias ¡¡

  4. Muy buen post…
    Pero, que es nc? seria bueno que hubieran comientarios describiendo cada linea de codigo par la orientacion los visitantes de la web… GRACIAS.

  5. Muy buena la web! Quería aportar un granito de arena optimizando este código un poquito.

    La mejora sería luego de la siguiente línea
    res=num%c;
    y simplemente agregar
    if(nc>2)
    break;

    de estar forma evitamos seguir contando al vicio.

    Simplemente eso.
    Saludos

  6. hola como se puede poner el en mismo programa que muestre los primos en un rango y q diga si el numero que ingresaste es primo?

  7. Hola, una pregunta…. Hice un programa en C que me da 10 numeros aleatorios, como puedo aplicar esta “ley de primos” para determina cuantos primos hay entre esos numeros aleatorios ?? :S

    Saludos ,.., y muy bueno el blog😛

  8. MUY facil num || numero empieza en cero para que pueda entrar a en ciclo while ya que While si la condicion es falsa se termina hay mismo y no deja entrar😀 y como 1 no es igual a 0 dentra, pero si quisiera dar solo una pasada usaría un DO WHILE ya que el DO WHILE deja por lo menos hacer un recorrido y al final lee la condición de que ingreses un numero distinto a cero😀 xau

    1. LA c ES EL CONTADOR QUE USA EL CICLO FOR PARA IR CONTANDO HASTA EL NUMERO INGRESADO Y DE HAY SE PARA EL CICLO

  9. alguien me podria decir como hacer un programa que me muestre numeros impares del 3 al 49 con el ciclo while xfavor!!!

  10. un programa para un rango de numeros limite inferior y superior y multiplo del rango e imprima los primos
    se los voy a agradecer

  11. Hola amigo vi tu post y me gusto eres excelente explicando pero tengo una consulta en como sacar primos le puedes echar un vistazo a mi programa!!!

    include
    #include

    using namespace std;

    int main()
    {
    int numero;
    int sumatotal = 0;
    double promedio;
    int mayor = 1;

    int contador = 0;
    int contador2;
    int contador3 = 0;
    int nc = 0;
    int arregloprimo [contador3];

    cout <> numero;

    // Se utiliza las estructuras if para calcular el numero mayor y el numero menor ingresado!!
    int menor = numero;

    if (numero >= mayor)
    mayor = numero;

    if (numero <= menor && numero !=0)
    menor = numero;

    while (numero != 0) {//inicio while

    sumatotal = sumatotal + numero; //acumulador

    cout <> numero;

    //Se vuelven a escribir exactanente las mismas estructuras if para evitar errores al introducir el primer numero

    if (numero >= mayor)
    mayor = numero;

    if (numero <= menor && numero !=0)
    menor = numero;

    contador++;
    //este procedimiento que sigue es para sacar los numeros primos que digita el usuario (EN LO QUE TENGO LA DUDA) pero me tira un error a la hora de tratar de almacenarlos en el arreglo , lo que quiero es almacenarlos y mostrar al final cuando el usuario digita 0 los numeros almacenados en el arreglo!!!

    for (contador2 = 1; contador2 <= numero; contador2++){// inicia for

    int calculoprimo = numero%contador2;
    if (calculoprimo == 0)
    nc++;
    }// fin de for
    if (nc <= 2 ) { //inicia if

    numero = arregloprimo[contador3] << endl;
    contador3 ++;} // finaliza if (aquí termina el procedimiento para sacar los primos pero me falla me ayudan a corregirlo para que funciones el resto esta bien!!!)

    }// fin de while

    // si el contador no es igual 0 se muestran los datos de lo contrario el usuario digito 0 en el primer numero

    if (contador != 0){ //inicia if
    cout << sumatotal << endl; // biennnn da bieeeen
    cout << mayor << endl;
    cout << menor <<endl;
    promedio = static_cast (sumatotal) / contador;
    cout << setprecision(2) << fixed << promedio;
    cout << “aqui va el arreglo mostrando los numeros primos almacenados” //lo que no puedo hacer ayuda plis
    } //fin de if

    else

    cout << "No se introdujeron datos!!!n";

    return 0;

    } //fin de main.

    1. #include
      using namespace std;

      int main()
      {
      int n=100,c=0,c2=0,res=0,nc=0;

      for(c=1;c<=n;c++)
      {
      for(c2=1;c2<=c;c2++)
      {
      res=c%c2;
      if(res==0)
      {
      nc=nc+1;
      }
      }
      if(nc==2)
      {
      cout<<"n"<<c;
      }
      nc=0;
      }
      }

  12. Esta es la respuesta para los numeros primos del 1 al 100.

    #include
    using namespace std;

    int main()
    {
    int n=100,c=0,c2=0,res=0,nc=0;

    for(c=1;c<=n;c++)
    {
    for(c2=1;c2<=c;c2++)
    {
    res=c%c2;
    if(res==0)
    {
    nc=nc+1;
    }
    }
    if(nc==2)
    {
    cout<<"n"<<c;
    }
    nc=0;
    }
    }

  13. hola necesito este ejecicio. utilizando funciones y procedimientos realice un algoritmo que diga si un numero es primo o no

  14. hola todos una consulta alguien sabe como hacer para obtener los números no primos en lenguaje C (c++) porfa se los agradezco mucho si me dan una respuesta gracias….

  15. La variable res es prescindible.

    Podemos ahorrarnos-la si en vez de “if(res==0)” directamente ponemos if(num%c==0).

    Por cierto el algoritmo está muy bien pensado! Gracias y felicidades por tan buen código.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s