elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  codigo para calcular los numeros primos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 4 Ir Abajo Respuesta Imprimir
Autor Tema: codigo para calcular los numeros primos  (Leído 21,890 veces)
minari02

Desconectado Desconectado

Mensajes: 26


Ver Perfil
codigo para calcular los numeros primos
« en: 24 Diciembre 2013, 01:00 am »

Hola que tal, he empezado con C++ hace poco, hay un ejercicio bastante concurrido cuando se esta estudiando programación y es de imprimir en pantalla números con ciertos rangos, uno de ellos es el de los números primos, creo que un no soy capaz por decirlo asi de poder programar dicho codigo, buscando, me he encontrado este código
Código:

#define LIMITE 35000
int main ()
{
   int i, j, primo, num;
   printf ("Introduzca numero: ");
   scanf ("%d", &num);
   i = num + 1;
   do
   {
      primo = 1;
      for (j = 2; j <= i/2 && primo; j++)
         if((i%j) == 0)
            primo = 0; 
      if (primo)
         printf("%d\n", i);   
      i++;   
   }while ( i < LIMITE && !primo);
   system("pause");
   return 0;
}
 

he intentado entenderlo pero hay algunas cosas que aun no comprendo, son pequeñas cosas, asi que desearía saber si por favor me ayudarían a comprenderlo, poniendo como comentario como funciona cada linea, bueno los temas que he visto son: funciones de entrada(con libreria stdio y iostream),tipos de datos,if y else,operadores logicos, ciclo while, ciclo for(hoy) todo de una manera superficial, que opinan ya deberia saber hacerlo?

Gracias.

pd: he visto que algunos se molestan con algunas preguntas algo asi... por que son preguntas talvez de tareas o similares, sin embargo... estén sin cuidado, yo ya he terminado el colegio y pues.. esto es solo algo que me apasiona y ps deseo aprenderlo aun por mi propia cuenta.jaja

Saludos. Feliz Navidad jeje...  ;-)  :laugh:  :xD  :rolleyes:


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: codigo para calcular los numeros primos
« Respuesta #1 en: 24 Diciembre 2013, 01:08 am »

Código
  1. #define LIMITE 35000
  2. int main ()
  3. {
  4.   int i, j, primo, num;
  5.   printf ("Introduzca numero: ");
  6.   scanf ("%d", &num);
  7.   i = num + 1;
  8.   do
  9.   {
  10.      primo = 1;
  11.      for (j = 2; j <= i/2 && primo; j++) //Pasamos por todos los números hasta i/2
  12.         if((i%j) == 0) //Si se encuentra un divisor (i/j -> resto==0) se pone que primo es = a 0
  13.            primo = 0;
  14.      if (primo) //Si es primo, lo escribe
  15.         printf("%d\n", i);    
  16.      i++;    //Aumenta 'i', para ir al siguiente número
  17.   }while ( i < LIMITE && !primo);
  18.   system("pause");
  19.   return 0;
  20. }
  21.  

Sencillamente, mira todos los números, desde 2 hasta la mitad del número, para ver si alguno es divisor. Si alguno lo es, resulta que no es primo, y primo = 0.

El programa mira el primer número superior al número que tú le introduces.

Acerca de lo de i/2, es porque, si no es divisible por 2, tampoco es divisible por su mitad. Así se ahorra mucho tiempo en números grandes.


En línea

minari02

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Re: codigo para calcular los numeros primos
« Respuesta #2 en: 24 Diciembre 2013, 01:19 am »

Hola amigo, gracias por tu respuesta  ;-), me podrias expricar para que sirve el %? no lo habia visto asi, solo %d, %c, f%
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: codigo para calcular los numeros primos
« Respuesta #3 en: 24 Diciembre 2013, 01:52 am »

5/2, en números enteros, da de resultado 2.
5%2, en números enteros, da de resultado 1.

% da el resto de una operación.
En línea

minari02

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Re: codigo para calcular los numeros primos
« Respuesta #4 en: 24 Diciembre 2013, 03:23 am »

mm.. amigo me podria decir que significa esta linea
Código:
printf("%4d",1);
creo que es muy importante, trate de cambiarla para entender mejor como funciona cada parte del programa y pues... simplemente sale un error es asi :
Código:
floating point exception (core dumped)
y pues... estuve buscando pero no se como se llama y no pude encontrar info sobre ello.

Gracias.
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: codigo para calcular los numeros primos
« Respuesta #5 en: 24 Diciembre 2013, 04:26 am »


Respuesta en que_significa_y_como_se_llama_printf4d1_en_c

No dupliques los temas, ya lo habías preguntado aquí. Espera que te contesten en lugar de abrir un nuevo tema con la misma pregunta que en este  tema.
:rolleyes:

Felices Navidades y Próspero Año Nuevo.
Saluditos! ..... !!!!



En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: codigo para calcular los numeros primos
« Respuesta #6 en: 24 Diciembre 2013, 10:29 am »

Sencillamente, mira todos los números, desde 2 hasta la mitad del número
En realidad sería hasta la raiz del número.

Ponte el caso con 36, el máximo divisor aquí es 6 (lo que viene a ser 6x6). Cualquier número que encuentres superior a eso 12 (12x3) no será nada más que el inverso de uno anterior (3x12).

También podríamos generarnos una tabla booleana diciendo cual es primo y cual no. Usando la criba de eratostenes (mira el gif):
http://es.wikipedia.org/wiki/Criba_de_Erat%C3%B3stenes
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: codigo para calcular los numeros primos
« Respuesta #7 en: 24 Diciembre 2013, 15:03 pm »

En realidad sería hasta la raiz del número.

El caso es si sabe donde se pone la raíz cuadrada. Y no olvidarse de incluir la librería math.h.


También podríamos generarnos una tabla booleana diciendo cual es primo y cual no. Usando la criba de eratostenes (mira el gif):
http://es.wikipedia.org/wiki/Criba_de_Erat%C3%B3stenes


A mi modesto entender, ello implica calcular y guardar en arrays los sucesivos múltiplos de 2,3,5, etc para posteriormente por comparación comprobar que no está en ellos. A mí por lo menos me ha dado una pobre eficiencia, supongo que debido al cambio de calcular si un módulo es cero por el tener que rellenar arrays y posteriormente comparar. Igual tu lo tienes más optimizado.

Una pequeña mejora, además de lo de la raíz, es ir comprobando sólo los impares, ya que sabemos que los pares, excepto el 2, no son primos:


Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main()
  5. {
  6.    int n,i,j,rq;
  7.    printf("Introduce el numero por favor: ");
  8.    fflush (stdout);
  9.    scanf("%d",&n);
  10.    if (n==1){
  11.        printf("2");
  12.        return 1;
  13.    }
  14.    printf("2");
  15.    fflush (stdout);
  16.    for (i = 3;i <= n;i+=2){
  17.  
  18.        j = 3;
  19.        while (j <= rq && i % j != 0)
  20.            j++;
  21.        if (i == j){
  22.            printf("%4d",j);
  23.            fflush (stdout);
  24.        }
  25.    }
  26.    return 0;
  27. }
  28.  

No es el más efiiciente pero no quería cambiarle sustancialmente su código. :rolleyes: :rolleyes: :rolleyes:

Felices Navidades y Próspero Año Nuevo.
Saluditos! ..... !!!!


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: codigo para calcular los numeros primos
« Respuesta #8 en: 24 Diciembre 2013, 15:16 pm »

Leosansan, no estableces en ningún momento el valor de la variable "rq".

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main()
  5. {
  6.    int n,i,j,rq;
  7.    printf("Introduce el numero por favor: ");
  8.    fflush (stdout);
  9.    scanf("%d",&n);
  10.    if (n==1){
  11.        printf("2");
  12.        return 1;
  13.    }
  14.    printf("2");
  15.    fflush (stdout);
  16.    for (i = 3;i <= n;i+=2){
  17.        rq = sqrt(i);
  18.        j = 3;
  19.        while (j <= rq && i % j != 0)
  20.            j++;
  21.        if (i == j){
  22.            printf("%4d",j);
  23.            fflush (stdout);
  24.        }
  25.    }
  26.    return 0;
  27. }
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: codigo para calcular los numeros primos
« Respuesta #9 en: 24 Diciembre 2013, 15:48 pm »

El caso es si sabe donde se pone la raíz cuadrada. Y no olvidarse de incluir la librería math.h.
No hace falta usar la librería math.h, estamos hablando de la raiz entera:

Código
  1. for (i = 2; (i*i) <= n;i++)

A mi modesto entender, ello implica calcular y guardar en arrays los sucesivos múltiplos de 2,3,5, etc para posteriormente por comparación comprobar que no está en ellos. A mí por lo menos me ha dado una pobre eficiencia, supongo que debido al cambio de calcular si un módulo es cero por el tener que rellenar arrays y posteriormente comparar. Igual tu lo tienes más optimizado.
No guardo los primos, sino todos los numeros naturales hasta N. Te dejo aquí el código:

Código
  1. #include <stdio.h>
  2. #define PRIMO 1
  3. #define COMPUESTO 0
  4. #define NO_DEFINIDO -1
  5.  
  6. const int MAX = 120;
  7.  
  8. void tacharMultiplos(char Tabla[],int N)
  9. {
  10.    int i;
  11.    for (i = 2;(N*i) <= MAX;i++)
  12.    {
  13.        Tabla[N*i] = COMPUESTO;
  14.    }
  15. }
  16.  
  17. void mostrarTabla(char Tabla[])
  18. {
  19.    int i = 2;
  20.    for (; i <= MAX;i++)
  21.        if (Tabla[i] == PRIMO) printf("%d\n",i);
  22. }
  23.  
  24. int main()
  25. {
  26.    // Generar Criba de erastotenes
  27.  
  28.    char Tabla[MAX+1]; // tabla booleana
  29.    int i = 0;
  30.  
  31.    // valor inicial
  32.  
  33.    for (; i<= MAX;i++) Tabla[i] = NO_DEFINIDO;
  34.  
  35.    for (i = 2;i<=MAX;i++)
  36.    {
  37.        if (Tabla[i] == NO_DEFINIDO) // si no esta inicializada...
  38.        {
  39.            Tabla[i] = PRIMO;
  40.            tacharMultiplos(Tabla,i);
  41.        }
  42.    }
  43.  
  44.    mostrarTabla(Tabla);
  45.    return 0;
  46. }

Si haces una solo comprobación no te sale rentable, pero si vas a hacer muchas comprobaciones te puede venir bien generarte esa tabla. De esa forma, cualquier comprobación que necesites hacer la puedes sacar instantaneamente para cualquier número <= MAX:

Código
  1. scanf("%d",&numero);
  2. if (numero < max)
  3. {
  4.  if (Tabla[numero]) puts("Es primo");
  5.  else puts("Es compuesto");
  6. }
  7. else
  8. {
  9.  if (esPrimo(numero)) puts("Es primo");
  10.  else puts("Es compuesto");
  11. }
« Última modificación: 24 Diciembre 2013, 15:54 pm por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
Páginas: [1] 2 3 4 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Python 2.6] Funcion generadora de Numeros primos (5.761.455 primos en 19 seg)
Scripting
katas 2 9,530 Último mensaje 10 Marzo 2010, 01:50 am
por Novlucker
Patrón para los números primos
Desafíos - Wargames
Jesusdpm 2 5,746 Último mensaje 30 Septiembre 2010, 21:50 pm
por MdosMil
calcular numeros primos « 1 2 »
Programación C/C++
AlkatraaZ 12 11,624 Último mensaje 4 Julio 2012, 20:19 pm
por AlkatraaZ
[JS] ¿Programa para calcular números primos?
Scripting
Linton 5 18,846 Último mensaje 23 Julio 2013, 07:40 am
por Linton
Ayuda con código para calcular los días de un mes
Programación C/C++
D_F4UL7 1 2,069 Último mensaje 25 Octubre 2016, 15:22 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines