Números primos en un rango

La idea es imprimir en pantalla los números primos entre 1 y un dato introducido por el usuario. Creo que es la primera vez que usamos un ciclo dentro de otro ciclo en este blog. Pero en realidad es muy sencillo:

#include<iostream>
using namespace std;

int main()
{
  int n=0,c=0,c2=0,res=0,nc=0;
  cout<<"Introduce el limite de numeros: "; cin>>n;
  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<<" "<<c;
    }
    nc=0;
  }
}

El operador % obtiene el residuo de la división de dos números. Por ejemplo:
10 % 3 = 1
Porque el 3 cabe 3 veces en el 10 y le sobra 1.

Explicación:

  1. El primer ciclo lleva la cuenta de los números de 1 a n de uno por uno en la variable c
  2. Luego se inicia un ciclo de 1 a c en la variable c2. Este ciclo se hará n veces porque está dentro de el primer ciclo
  3. En la variable res se guarda el residuo de dividir c / c2
  4. Si el residuo es cero, se incremento al contador nc
  5. Si al terminarse el segundo ciclo el contador nc es igual a 2, significa que el número es primo y lo imprime

Recuerden que los números primos son los que únicamente se dividen (sin dejar residuo) entre 1 y entre si mismos

80 thoughts on “Números primos en un rango

  1. Hola me podrías ayudar con este porfis:
    Se necesita un sistema que almacena automáticamente todos los números primos desde el uno hasta el mil uno; recordando que un número primo es aquel que solamente es divisible entre uno y si mismo.

  2. ola amigo soy nuevo en esto de la programacion y necesito como puedo hacer eliminar numeros capicuas de un vector en C#, haber si puedes ayudarme en este caso

  3. ALGUIEN ME AYUDA ME URGE implemente un programa que permita encontrar el conjunto de los 10.000 primeros numeros primos en C.

    Gracias

  4. hola nesecito saber cuando tengo tengo un rango de 0 a 600 q me muestre todos los primos en filas de 5 numeros primos coo hago se los agradeceria

  5. hola necesito que me ayuden con este ejercicio.

    Escribir un programa en C++ que muestre en pantalla los primeros N (entero positivo) números compuestos. Se debe implementar una función que reciba como parámetro un número entero, y retorne 1 si es compuesto o cero si no lo es.

    Todo número natural no primo, a excepción del 1, se denomina compuesto, es decir, tiene uno o más divisores distintos a 1 y a sí mismo. También se utiliza el término divisible para referirse estos números. Los 20 primeros números compuestos son: 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, 30 y 32.

  6. Hola Muchas Gracias por tu programa solo necesito saber por que cada una de las variables para poder realizar el algoritmo😉

  7. Este programa sirve para rangos pequeños, como pongas un rango de, por ejemplo, 1 a 10000000, ya te puedes sentar a esperar que termine (más que nada porque tiene que realizar más o menos 50 billones de divisiones, siendo un billón un uno seguido de 12 ceros). El algoritmo está bien como ilustración de lo que significa, pero es bastante ineficiente. Como ilustración, a continuacion expongo el código fuente de un programa que hice hace poco como ejercicio de programación que realiza precisamente esa tarea y en mi ordenador tarda 9 segundos en sacar los números primos, grabándolos incluso en un archivo de texto (debo aclarar que lo he compilado con MingW con todas las optimizaciones activadas, si no las activo puede tardar del orden de 14 segundos).

    /*
    * NumerosPrimos.cpp: define el punto de entrada de la aplicación de consola.
    */

    #include
    #include
    #include
    #include
    #include
    #include
    #include

    // Defino las funciones auxiliares.
    bool EsPrimo( int );
    void EmitirPrimo( int );

    using namespace std;

    int Limite = 10000000;
    int paso;
    int anchura = 75;

    enum Accion
    {
    AbrirCanal = 0,
    CerrarCanal = 1
    };

    int main( int argc, char* argv[] )
    {
    int num;
    int inicio;
    int fin;
    int total = 2;
    double diferencia;

    setlocale( LC_ALL, “spanish” );

    if( argc > 1 )
    {
    num = atoi( argv[1] );
    if( num )
    {
    Limite = num;
    }
    }
    paso = Limite / anchura;
    EmitirPrimo( AbrirCanal ); // Abro el canal de salida
    inicio = clock();
    EmitirPrimo( 2 );
    EmitirPrimo( 3 );
    cout << "Voy a obtener los números primos entre 2 y " << Limite << "." << endl; ;
    for( int x = 0; x < anchura; x++ )
    {
    cout << "·";
    }
    cout << "r" << flush;
    int i = 5;
    int k = 5;
    while( i = paso )
    {
    k = 0;
    cout << "#" <= paso )
    {
    k = 0;
    cout << "#" << flush;
    }
    if( EsPrimo( i ) )
    {
    EmitirPrimo( i );
    total++;
    }
    i += 4;
    k += 4;
    }
    cout << "#" << endl;
    fin = clock();
    EmitirPrimo( CerrarCanal ); // Cierro el canal de salida
    diferencia = ( ( double )( fin – inicio ) ) / CLOCKS_PER_SEC;
    cout << "He tardado " << diferencia << " segundos.n";
    cout << "He generado " << total << " números primos." << endl;
    return 0;
    }

    bool EsPrimo( int Numero )
    {
    static int Raiz;
    static int x;

    Raiz = ( int )ceil( sqrt( ( double )Numero ) );

    if( !( Numero % 3 ) )
    {
    return false;
    }
    x = 5;
    while( x 1 )

    {
    archivo << setw( 4 ) << Numero << " ";
    i++;
    if( i == 10 )
    {
    i = 0;
    archivo << "n";
    }
    }
    else
    {
    if( Numero == AbrirCanal )
    {
    archivo.open( "primos.txt", ios_base::out | ios_base::trunc );
    }
    if( Numero == CerrarCanal )
    {
    if( !archivo.bad() )
    {
    archivo << endl;
    archivo.close();
    }
    }
    }
    }

    1. Parece que el sistema de copiar y pegar no funciona del todo bien con el código fuente.
      /*
      * NumerosPrimos.cpp: define el punto de entrada de la aplicación de consola.
      */

      #include
      #include
      #include
      #include
      #include
      #include
      #include

      // Defino las funciones auxiliares.
      bool EsPrimo( int );
      void EmitirPrimo( int );

      using namespace std;

      int Limite = 10000000;
      int paso;
      int anchura = 75;

      enum Accion
      {
      AbrirCanal = 0,
      CerrarCanal = 1
      };

      int main( int argc, char* argv[] )
      {
      int num;
      int inicio;
      int fin;
      int total = 2;
      double diferencia;

      setlocale( LC_ALL, “spanish” );

      if( argc > 1 )
      {
      num = atoi( argv[1] );
      if( num )
      {
      Limite = num;
      }
      }
      paso = Limite / anchura;
      EmitirPrimo( AbrirCanal ); // Abro el canal de salida
      inicio = clock();
      EmitirPrimo( 2 );
      EmitirPrimo( 3 );
      cout << "Voy a obtener los números primos entre 2 y " << Limite << "." << endl; ;
      for( int x = 0; x < anchura; x++ )
      {
      cout << "·";
      }
      cout << "r" << flush;
      int i = 5;
      int k = 5;
      while( i = paso )
      {
      k = 0;
      cout << "#" <= paso )
      {
      k = 0;
      cout << "#" << flush;
      }
      if( EsPrimo( i ) )
      {
      EmitirPrimo( i );
      total++;
      }
      i += 4;
      k += 4;
      }
      cout << "#" << endl;
      fin = clock();
      EmitirPrimo( CerrarCanal ); // Cierro el canal de salida
      diferencia = ( ( double )( fin – inicio ) ) / CLOCKS_PER_SEC;
      cout << "He tardado " << diferencia << " segundos.n";
      cout << "He generado " << total << " números primos." << endl;
      return 0;
      }

      bool EsPrimo( int Numero )
      {
      static int Raiz;
      static int x;

      Raiz = ( int )ceil( sqrt( ( double )Numero ) );

      if( !( Numero % 3 ) )
      {
      return false;
      }
      x = 5;
      while( x 1 )

      {
      archivo << setw( 4 ) << Numero << " ";
      i++;
      if( i == 10 )
      {
      i = 0;
      archivo << "n";
      }
      }
      else
      {
      if( Numero == AbrirCanal )
      {
      archivo.open( "primos.txt", ios_base::out | ios_base::trunc );
      }
      if( Numero == CerrarCanal )
      {
      if( !archivo.bad() )
      {
      archivo << endl;
      archivo.close();
      }
      }
      }
      }

  8. Hola alguien me puede ayudar con el sguiente programa::
    Pedir un umero al usuario, si es par mostar una serie del nuemro al cero y del cero al numero, si es impar, mostrar una serie del cero al numero y delnumero al cero!
    Agradeceria su ayuda

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