Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Caster en 24 Mayo 2014, 15:21 pm



Título: Problema con programa para hallar numeros primos
Publicado por: Caster en 24 Mayo 2014, 15:21 pm
Buenas, estoy intentando hacer un programa que halle los numeros primos entre 0 y n, ya se que ha salido mas de una vez en el foro y que habrá mucha información por ahí sobre este problema. Ya he estado leyendo algunos posts anteriores y basandome en ellos hice esto, que es la parte prinicpal del programa, el resto da igual ahora mismo:

Código
  1. for(j= 3; j <= num; j += 2){
  2.        for(i = 3; i <= j; i++){
  3.            if((j%1) == 0 && (j%j) == 0 && (j%i) == 0)
  4.            printf("\n%d\t", j);
  5.        }
  6.    }

En este codigo, con el 15 por ejemplo, se realiza la comprobacion 13 veces (desde 3 a 15, ambos inclusive), 3 de ellas son verdaderas (i=3; i=5; i=15) y el resto son falsas. Digo esto porque con esta comprobacion el 15 sale 3 veces, y que tampoco me valdria poner:

Código
  1. if((j%1) == 0 && (j%j) == 0 && (j%i) != 0)

Porque saldría el resto de las veces, es decir, 10.

También probé a poner:

Código
  1. if((j%1) == 0 && (j%j) == 0)

El problema es que esta condicion la cumplen todos los numeros, no solo los primos, lo que pasa es que lo que caracteriza a los numeros primos es que solo cumplen esas dos condiciones, lo que quiero decir es que no logro aislar los numeros que solo cumplan esas dos condiciones, que son los que yo busco.

Un saudo


Título: Re: Problema con programa para hallar numeros primos
Publicado por: ivancea96 en 24 Mayo 2014, 15:37 pm
Código
  1. if((j%1) == 0 && (j%j) == 0)

Esta condición es absurda. Cualquier número mayor que 0 cumple que es divisible entre 1 y entre si mismo.


Título: Re: Problema con programa para hallar numeros primos
Publicado por: Caster en 24 Mayo 2014, 16:31 pm
Código
  1. if((j%1) == 0 && (j%j) == 0)

Esta condición es absurda. Cualquier número mayor que 0 cumple que es divisible entre 1 y entre si mismo.

Ya, pero en el momento en el que la puse no me di cuenta  :xD

Aunque en verdad, esa condición debe de ser la única que cumplan los números primos y es lo que no se hacer, como aislar los numeros que solo cumplen esa condicion y ninguna mas.

Un saludo.


Título: Re: Problema con programa para hallar numeros primos
Publicado por: rir3760 en 24 Mayo 2014, 17:11 pm
esa condición debe de ser la única que cumplan los números primos y es lo que no se hacer, como aislar los numeros que solo cumplen esa condicion y ninguna mas.
Solo tienes que utilizar un bucle que se repita mientras el residuo de la división "N / contador" sea diferente de cero con el contador iniciando con el valor dos y terminando de forma natural con el valor N si el numero es primo (si tiene un valor menor significa que no lo es).

Un ejemplo:
Código
  1. int i;
  2. int j;
  3.  
  4. for (i = 2; i < 100; i++){
  5.   for (j = 2; i % j != 0; j++)
  6.      ;
  7.  
  8.   if (j == i)
  9.      printf("%d\n", j);
  10. }

Esa es la forma mas fácil pero menos eficiente, ejemplos sobre como reducir el numero iteraciones los puedes consultar mediante el motor de búsqueda de los foros.

Un saludo


Título: Re: Problema con programa para hallar numeros primos
Publicado por: ivancea96 en 24 Mayo 2014, 17:44 pm
Código
  1. int i;
  2. int j;
  3.  
  4. for (i = 2; i < 100; i++){
  5.   for (j = 2; i % j != 0; j++)
  6.      ;
  7.  
  8.   if (j == i)
  9.      printf("%d\n", j);
  10. }
sobre como reducir el numero iteraciones

Pueder reducir a la mitad, poniendo for (j = 2; i % j != 0 && j<i/2; j++) por ejemplo. O j<=sqrt(i)

También puedes ir almacenando un vector de números primos, y luego sería comprobar si es divisible entre esos números.

Pero para números pequeños, la solución que puso rir3760 sobra.


Título: Re: Problema con programa para hallar numeros primos
Publicado por: engel lex en 24 Mayo 2014, 17:51 pm
recomiendo

for(actual  =3; actual <= maximo; actual = actual + 2){
   for(comprobador=3; comprobador <=(int) raiz(actual);comprobador = comprobador +2){
    
//codigo

}}
eso debería darte una eficiencia bastante alta (sorry por no usar geshi, estoy en el cel y es complicado)

solo pasa por impares y la verificacion solo por impares y solo hasta la raiz del número


Título: Re: Problema con programa para hallar numeros primos
Publicado por: leosansan en 24 Mayo 2014, 19:04 pm
.............................................
Aunque en verdad, esa condición debe de ser la única que cumplan los números primos y es lo que no se hacer, como aislar los números que solo cumplen esa condición y ninguna mas.


Has puesto el dedo en la llaga: si es primo los divisores, sin contar el 1 y al propio número son cero, si no no es primo.

Como ves todo se reduce a ver si tiene algún divisor, cosa que previamente no sabes y habrá que ir comprobando para cada número.

Te paso un código comentado con esa idea.

 Ya lo de ir de dos en dos recorriendo sólo los impares o llegar tan sólo hasta sqrt(i) o mejor, porque no usamos la librería math para sqrt, hasta j*j<=i, son detalles de mejorar la eficiencia pero creo que no era esa la cuestión.

Código
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.  int i,j,num=15,aux=0;
  5.  printf("2  ");/** supuesto num>1 **/
  6.  for (i=3; i<=num;i+=2) {
  7.    aux=0;
  8.    for (j=3;j*j<=i;j+=2){
  9. /** Aqui si tiene un divisor no es primo y pongo aux a 1
  10.  para saberlo y rompo el bucle ya que no tiene mayor importancia
  11.  que tenga mas divisores **/
  12.      if (i%j==0){
  13.        aux=1;
  14.        break;
  15.      }
  16.    }
  17. /** Aqui si aux=0 es que no tiene divisores y por tanto es primo **/
  18.    if (aux==0)
  19.      printf ("%d  ",i);
  20.  }
  21.  return 0;
  22. }


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)