Calculo de números primos

Iniciado por jamatbar, 12 Noviembre 2011, 14:26 PM

0 Miembros y 1 Visitante están viendo este tema.

Ferno

Si ponés un 1 o un 2 en tu programa, no entra ni siquiera una vez en el for, porque no se cumple la condición (i < valor), ya que i comienza en el número 2.
Sin embargo, no está bien el algoritmo. Ese bucle no hace nada. ¿Como sabés si es primo o no ahí?
Primero pensá el problema matemáticamente, luego pasalo a la máquina tal cual lo pienses.
En este caso, un número es primo si y solo si es divisible sólo por si mismo y por el 1.
Entonces, para pasarlo a máquina, tendrás que ver si el número es divisible por algún número entre el 1 y el mismo. Para eso se usa el bucle, cuando encuentres algún número que divida a tu valor, entonces no será primo (ahí entra el flag en funcionamiento), sino, es primo.

jamatbar

Perdon, me comí un par de líneas de código, ya lo he editado

Saludos

rir3760

En el caso de la aproximacion de fuerza bruta esta se puede mejorar un poco reduciendo el rango y utilizando al contador del bucle como bandera. De esta forma:
#include <stdio.h>
#include <stdlib.h>

int es_primo(int num);

int main(void)
{
    int i;
   
    for (i = 2; i < 100; i++)
        if (es_primo(i))
            printf("%d\n", i);
   
    return EXIT_SUCCESS;
}

int es_primo(int num)
{
    int i;
   
    for (i = 2; i*i <= num && num % i != 0; i++)
        ;
   
    return i*i > num;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

jamatbar

Ya he conseguido hacerlo, muchas gracias a todos por vuestra ayuda.

Saludos!

jamatbar

A ver, el programa me ha quedado así:

#include <stdio.h>

int main ()
{
  int valor;
  int i;
  int flag = 1;//variable de control
  printf("Introduzca un valor:");
  scanf ("%d", &valor);//lee el número
 
  for (i=2; i < valor ; i++ )
    if (0 == (valor % i ))
      {//bucle que se repite hasta que i es igual a valor
flag = 0;
      }
  if (flag == 1)
    printf ("%d es un número primo\n", valor);
  else // en funcion del valor de flag se imprime una u otra cosa
    printf ("%d no es primo \n", valor);
  return 0;
}


Ahora me piden que: Para mejorar la eficiencia del programa, el bucle debe finalizar una vez encontrado el primer divisor. Para ello deberá hacer uso de la variable de control usada en el apartado anterior.

No lo entiendo, ¿se supone que el programa ya termina cuando encuentra un divisor no?

Saludos

Ferno

Te recomiendo enormemente ponerle respectivas llaves a todas las instrucciones, más allá de que lleven una sola sentencia o no.
Ahora bien, no, ahí el programa sigue hasta terminar con el bucle for.

Para que termine cuando el flag lo indique o cuando llegue a terminar todas las repeticiones deberás usar otra estructura repetitiva (while o do-while) con 2 condiciones: Que el flag siga siendo falso y hasta que llegue al valor en cuestión.

CobraCY

ya mira, cuando haces el FOR, dices: "Declara una variable 'i' que inicie en dos(2) y que se aumente en 1(i++) mientras que sea menor a el valor de 'n'.".

Con esto haces que tu variable 'i' haga el recorrido desde el numero 2 hasta n.
Si vez bien el código que te puse usé la siguiente linea para el FOR:
Código (cpp) [Seleccionar]

for(int i=2; i < n && flag==0;i++)


Con esto digo: "Declara una variable 'i' que inicie en dos(2) y que se aumente en 1(i++) mientras que mi variable 'i' sea menor que 'n' y además que mi variable 'flag' sea sea exactamente igual a cero(0)".

Si te das cuenta en tu código haces un 'if' donde preguntas si el residuo de tu valor entre el valor que lleva la variable 'i' es cero(0), entonces cambie tu flag a 0, ese valor puedes utilizarlo en el for para que si 'flag' es distinto(!=) de cero(0) entonces continúe con la ejecución del for.

Saludos.

RyogiShiki

NO he visto las respuestas, pero dejo este video que ayuda mucho:

[youtube=600,400]http://www.youtube.com/watch?feature=player_embedded&v=FU1hi6cSpjQ[/youtube]


satu

Hola

Además el bucle se podría acortar hasta la mitad:


for(int i=2; i <= n/2 && flag==0;i++)


Saludos
Breakbeat como forma de vida

CobraCY

te hice un video rápido para ver si te puedo ayudar.
[youtube=425,350]http://www.youtube.com/watch?v=t3zY9IXOxzU[/youtube]
Saludos.