calcular numeros primos

Iniciado por AlkatraaZ, 3 Julio 2012, 22:25 PM

0 Miembros y 3 Visitantes están viendo este tema.

AlkatraaZ

Buenas tardes gente, soy bastante nuevo en el mundo de la programacion y estoy haciendo algunos ejercicios de operadores y estructuras de control, uno me pedia que calcule si un numero es primo o no, lo calcule de esta manera:
Código (cpp) [Seleccionar]
#include <iostream>
#define pl '\n'
#include <cstdlib>
using namespace std;
/*Leer un numero natural N. Determinar con un mensaje alusivo si es primo.*/
int main(int argc, char *argv[]) {
int n,c,suma,x;
cout<<"Calcular si un numero es primo"<<pl;
cout<<"Ingrese un numero"<<pl;
cin>>n;
while (n<=1){
cout<<"ERROR: El numero ingresado es incorrecto"<<pl;
cout<<"ingrese un numero"<<pl;
cin>>n;
}
c=n-1;
while (c>1){
x=n%c;
suma*=x;
c--;
}
if (suma==0) {
cout<<"El numero "<<n<<" no es primo"<<pl;
}
else {
cout<<"El numero "<<n<<" es primo"<<pl;
}
system("PAUSE");
return 0;
}


Creen que me complique mucho de alguna manera?

Y ahora estoy intentando hacer uno que calcule una cantidad x de numeros primos (osea, si pongo 10, que devuelva 2, 3, 5, 7, 11, 13,  17, 19, 23, 27) pero no lo pude adaptar, como me recomiendan hacerlo?

Desde ya muchas gracias.
Tomas.

tremolero

Hola Alkatraaz, te digo lo poco que se me ha ocurrido para adaptarlo y que te calcule la cantidad de numeros.
solicitas la cantidad de primos que debe calcular, lo guardas en una variable.
luego metes todo tu programa en un bucle while en que la condicion es salir=false.
y luego dentro del while, pones una variable que empiece desde uno y se vaya sumando, cada vez que un numero sea pi, coges una variable llamemosla contador y le vas sumando +1, cuando contador sea igual a la cantidad de primos que debes calcular, le dices que salir=true y se acabo.

si no me he rallado, creo que te servira.

Saludos...

ralymontes

No entendi muy bn tu codigo, pero para el segundo problema que harás, en realidad, pues me gusa mucho :D, lo hice tambien cuando iniciaba (bueno, uno parecido), y es un ejemplo padre de programacion.... el grano.

Aquella vez lo que tenia que hacer era si me daban 10 (como en tu ejemplo) debia sacar por pantalla los numeros primos que hay hasta el 10, en éste caso sería 2, 3, 5 y 7.

Entocnes lo que hice fue establecer un arreglo (si no mal recuerdo utilice 2 for anidados...) de tamaño N (N=el numero ingresado) y con un indice recorrer cada posicion (logico, cada posicion es un numero de arreglo, solo cuida si inicias desde 0 ó desde 1 XD ) , y dividirlo entre TODOS los numeros que hay desde 1 hasta N, y contar las veces que i%N==0 (siendo N la posicion del arreglo), al final, el numero de veces que se cumple aesa condicion debe ser igual a 2 ... ;)

Ojalá me hayas entendido.

Saludos, Raly.

DickGumshoe

Yo lo que haría sería una función que calcule si cierto número es primo o no (en vez de ponerlo en main(), para que lo que viene después sea más fácil).

Entonces, con un bucle for, iría incrementando una variable en uno, y calculando si el valor de dicha variable es un número primo mediante la función anterior. En caso de serlo, aumentas una variable llamada contador y guardas el número primo en un vector. Cuando el contador llegue a 10, tendrás los 10 primeros números primos.

Saludos.

BlackZeroX

Usa la Criba de Eratóstenes para calcularlos, en el foro ya se han hecho varios códigos (ni me los pidas).

* Inclusive en wikipedia esta el código en varios lenguajes...

Dulces Lunas!¡.
The Dark Shadow is my passion.

AlkatraaZ

Cita de: DickGumshoe en  3 Julio 2012, 23:18 PM
Yo lo que haría sería una función que calcule si cierto número es primo o no (en vez de ponerlo en main(), para que lo que viene después sea más fácil).

Entonces, con un bucle for, iría incrementando una variable en uno, y calculando si el valor de dicha variable es un número primo mediante la función anterior. En caso de serlo, aumentas una variable llamada contador y guardas el número primo en un vector. Cuando el contador llegue a 10, tendrás los 10 primeros números primos.

Saludos.
todavia no llegue a la parte de funciones, voy leyendo cada unidad y haciendo los ejercicios propuestos, pero me gusta tu idea :P

Cita de: ralymontes en  3 Julio 2012, 22:47 PM
No entendi muy bn tu codigo, pero para el segundo problema que harás, en realidad, pues me gusa mucho :D, lo hice tambien cuando iniciaba (bueno, uno parecido), y es un ejemplo padre de programacion.... el grano.

Aquella vez lo que tenia que hacer era si me daban 10 (como en tu ejemplo) debia sacar por pantalla los numeros primos que hay hasta el 10, en éste caso sería 2, 3, 5 y 7.

Entocnes lo que hice fue establecer un arreglo (si no mal recuerdo utilice 2 for anidados...) de tamaño N (N=el numero ingresado) y con un indice recorrer cada posicion (logico, cada posicion es un numero de arreglo, solo cuida si inicias desde 0 ó desde 1 XD ) , y dividirlo entre TODOS los numeros que hay desde 1 hasta N, y contar las veces que i%N==0 (siendo N la posicion del arreglo), al final, el numero de veces que se cumple aesa condicion debe ser igual a 2 ... ;)

Ojalá me hayas entendido.

Saludos, Raly.
te referis a algo asi no (no es de mi autoria, lo busque por internet)
Código (cpp) [Seleccionar]
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++;
}
}
if(nc==2)
{
cout<<c<<" ";
}
nc=0;
}
cout<<pl;
system("PAUSE");
}


Cita de: BlackZeroX (Astaroth) en  4 Julio 2012, 00:33 AM
Usa la Criba de Eratóstenes para calcularlos, en el foro ya se han hecho varios códigos (ni me los pidas).

* Inclusive en wikipedia esta el código en varios lenguajes...

Dulces Lunas!¡.

la criba de eratostenes es el codigo que le acabo de pasar a Raly (a grandes rasgos claro) que como el bien dice si yo pongo 10, en vez de darme los 10 primeros numeros primos te da todos los primos menores que 10 (wiki says: La criba de Eratóstenes es un algoritmo que permite hallar todos los números primos menores que un número natural dado N)

ralymontes

Citarte referis a algo asi no (no es de mi autoria, lo busque por internet)
Código

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++;
         }
      }
      if(nc==2)
      {
         cout<<c<<" ";
      }
      nc=0;
   }
   cout<<pl;
   system("PAUSE");
}

Exacto, a eso m referia, creo que no es muy óptmo por el gran numero de comparaciones, pero funciona :D

do-while

¡Buenas!

Tienes un  gran error en tu primer codigo. Estas multiplicando la variable suma por algo sin haberla inicializado, por lo que en principio puede tener cualquier valor, incluido el cero (es mas, en C++ creo que se inicializa a cero por defecto). Por lo que cualquier resultado de multiplicar suma por otro valor podria ser siempre cero, lo que te daria un falso negativo en la busqueda de primos. Tienes que inicializar suma a uno.

Intenta inicializar las variables o hacerles una asignacion antes de utilizarlas con un valor que tenga sentido con el uso que les vayas a dar.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

AlkatraaZ

Cita de: do-while en  4 Julio 2012, 09:19 AM
¡Buenas!

Tienes un  gran error en tu primer codigo. Estas multiplicando la variable suma por algo sin haberla inicializado, por lo que en principio puede tener cualquier valor, incluido el cero (es mas, en C++ creo que se inicializa a cero por defecto). Por lo que cualquier resultado de multiplicar suma por otro valor podria ser siempre cero, lo que te daria un falso negativo en la busqueda de primos. Tienes que inicializar suma a uno.

Intenta inicializar las variables o hacerles una asignacion antes de utilizarlas con un valor que tenga sentido con el uso que les vayas a dar.

¡Saludos!

Muy por el contrario amigo, creo que nunca se inicializan en 0, por eso es que los inicializo cuando necesito que sean 0 o algun valor especifico...
por darte un ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
int asd;
cout<<asd;
return 0;
}


este codigo devuelve como valor de asd el numero 2130567168

Pero por las dudas voy a tomar en cuenta tu consejo, no cuesta nada y nunca esta de mas ^^
Ahora me voy a seguir luchando con el de calcular los N primeros primos :P

SXF

Como que nunca se inicializan nunca a cero, bueno en algunos lenguajes si como java me parece u otros aunque es mejor prevenir que curar y asegurarte.