Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: AlkatraaZ en 3 Julio 2012, 22:25 pm



Título: calcular numeros primos
Publicado por: AlkatraaZ en 3 Julio 2012, 22:25 pm
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
  1. #include <iostream>
  2. #define pl '\n'
  3. #include <cstdlib>
  4. using namespace std;
  5. /*Leer un numero natural N. Determinar con un mensaje alusivo si es primo.*/
  6. int main(int argc, char *argv[]) {
  7. int n,c,suma,x;
  8. cout<<"Calcular si un numero es primo"<<pl;
  9. cout<<"Ingrese un numero"<<pl;
  10. cin>>n;
  11. while (n<=1){
  12. cout<<"ERROR: El numero ingresado es incorrecto"<<pl;
  13. cout<<"ingrese un numero"<<pl;
  14. cin>>n;
  15. }
  16. c=n-1;
  17. while (c>1){
  18. x=n%c;
  19. suma*=x;
  20. c--;
  21. }
  22. if (suma==0) {
  23. cout<<"El numero "<<n<<" no es primo"<<pl;
  24. }
  25. else {
  26. cout<<"El numero "<<n<<" es primo"<<pl;
  27. }
  28. system("PAUSE");
  29. return 0;
  30. }

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.


Título: Re: calcular numeros primos
Publicado por: tremolero en 3 Julio 2012, 22:42 pm
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...


Título: Re: calcular numeros primos
Publicado por: 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.


Título: Re: calcular numeros primos
Publicado por: 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.


Título: Re: calcular numeros primos
Publicado por: BlackZeroX 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!¡.


Título: Re: calcular numeros primos
Publicado por: AlkatraaZ en 4 Julio 2012, 00:46 am
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

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
  1. int main()
  2. {
  3. int n=0,c=0,c2=0,res=0,nc=0;
  4. cout<<"Introduce el limite de numeros: "; cin>>n;
  5. for(c=1;c<=n;c++)
  6. {
  7. for(c2=1;c2<=c;c2++)
  8. {
  9. res=c%c2;
  10. if(res==0)
  11. {
  12. nc++;
  13. }
  14. }
  15. if(nc==2)
  16. {
  17. cout<<c<<" ";
  18. }
  19. nc=0;
  20. }
  21. cout<<pl;
  22. system("PAUSE");
  23. }

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)


Título: Re: calcular numeros primos
Publicado por: ralymontes en 4 Julio 2012, 04:54 am
Citar
te 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


Título: Re: calcular numeros primos
Publicado por: 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!


Título: Re: calcular numeros primos
Publicado por: AlkatraaZ en 4 Julio 2012, 17:20 pm
¡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
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main(int argc, char *argv[]) {
  5. int asd;
  6. cout<<asd;
  7. return 0;
  8. }
  9.  

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


Título: Re: calcular numeros primos
Publicado por: SXF en 4 Julio 2012, 17:35 pm
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.


Título: Re: calcular numeros primos
Publicado por: AlkatraaZ en 4 Julio 2012, 18:33 pm
do-while, aunque no lo creas me diste la solucion al de los primeros N primos jajaj
ayer a la noche estaba teniendo un problema, si yo queria encontrar los 10 primeros primos, me daba solamente 2, 3 y el programa quedaba ejecutando, como en un bucle... este era el codigo:
Código
  1. #include <iostream>
  2. #define pl '\n'
  3. #include <cstdlib>
  4. #include <cstdio>
  5. using namespace std;
  6. /*Determine los 1000 primeros primos.*/
  7. int main(int argc, char *argv[]) {
  8. int n=2,c=n-1,suma,p,contp=0;
  9. cout<<"Ingrese la cantidad de numeros primos que desea obtener"<<pl;
  10. cin>>p; //p=cantidad de primos que quiero obtener
  11. while (contp<p)//mientras los primos que obtube<los que quiero...
  12. {
  13. while (c>1)
  14. {
  15. suma*=n%c;
  16. c-=1;
  17. }
  18. if (suma!=0)
  19. {
  20. cout<<"El numero "<<n<<" es primo"<<pl;
  21. contp++;//cuenta que obtubo un primo
  22. }
  23. suma=1; //<- me faltaba esto!
  24. n++;//
  25. c=n-1;
  26. }
  27. system("PAUSE");
  28. return 0;
  29. }

yo pensaba que cuando el numero no era primo (como seria el caso del 4, que no me aparecia) y pasaba por el lado falso del if no hacia n++, estuve largo rato rompiendome la cabeza hasta que me di cuenta que me faltaba volver a darle un valor distinto de 0 a suma, sino una vez que un numero no fuera primo, en adelante suma iba a ser siempre 0, que error tonto...


Título: Re: calcular numeros primos
Publicado por: do-while en 4 Julio 2012, 20:10 pm
XD

Pues tenia entendido que c++ inicializaba a cero, pero no debe ser asi entonces. Por lo tanto debe se como en C, que las variables tienen "basura", y en particular, auque sea poco problable, es posible que ese valor inicial sea cero. Por eso intenta inicializar las variables con valores que tengan sentido para el uso que les vayas a dar (o como en este caso, una vez que terminas de usarlas, dejarlas como al principio para la siguiente vez que las utilices).

¡Saludos!


Título: Re: calcular numeros primos
Publicado por: AlkatraaZ en 4 Julio 2012, 20:19 pm
igualmente ahora solo calcula hasta el primo 61... creo que es el 16º, despues no arroja ningun valor y queda ejecutando indefinidamente... ya me voy a poner a hacerle una prueba de escritorio a ver que esta fallando...