Calculo de números primos

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

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

s00rk

No se puede utilizar dentro del if el break; y ya ? xD
Terminara el for y continuara  :silbar:

CobraCY

si, pero el está pidieron que utilicemos un flag. Así que hay que cumplir con sus exigencias xD.

Saludos.

jamatbar

Gracias a todos por vuestras ayudas, y hombre, no son exigencias, es que básicamente me lo piden con eso XD

jamatbar

#23
Mi código ha quedado así:

#include <stdio.h>
int main()
{
int valor;
int i;
int flag = 1;

printf("Introduzca un valor: ");
scanf(" %d", &valor);

for ( i = 2; i < valor && flag!=0; i++ )
if (0 == (valor % i))
{flag = 0;
}
if (flag == 1)
printf(" %d es primo\n", valor);
else
printf(" %d no es primo\n",valor);
return 0;
}


Pero ahora me piden que una vez comprobado que el dos no es divisor, probar sólo con los números impares.


EDITO poniendo lo que he intentado:

#include <stdio.h>
int main()
{
int valor;
int i;
int flag = 1;

printf("Introduzca un valor: ");
scanf(" %d", &valor);

for ( i = 2; i < valor && flag!=0; i+=2 )
if (0 == (valor % i))
{flag = 0;
}
if (flag == 1)
printf(" %d es primo\n", valor);
else
printf(" %d no es primo\n",valor);
return 0;
}


¿Con eso bastaría no?


Saludos

rir3760

No porque si revisas el bucle te daras cuenta que solo estas dividiendo entre los numeros pares mientras que el enunciado te pide revisar la serie 2, 3, 5, 7, ... N.

Un problema con el (debido a esa serie) es que debes manejar el caso especial donde el numero es par, si es dos es primo, cualquier otro no lo es.

Con los cambios:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int numero;
    int i;
    int es_primo;
   
    printf("Introduce el numero: ");
    fflush(stdout);
    if (scanf("%d", &numero) != 1 || numero < 2)
        return EXIT_FAILURE;
   
    es_primo = numero == 2 || numero % 2 == 1;
    for (i = 3; i < numero && es_primo; i += 2)
        if (numero % i == 0)
            es_primo = 0;
   
    if (es_primo)
        printf("%d es primo\n", numero);
    else
        printf("%d no es primo\n", numero);
       
   return EXIT_SUCCESS;
}


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

xBurninGx

Hola,

si nos ponemos a hacer código, cuando mejor sea mejor, no?

para saber si es un número es primo, no hay que llegar a dividirle entre todos los numeros anteriores a ese número para saberlo, por una demostración algebraica, que no me voy a para a explicar, con probar hasta la raíz cuadrada de ese mismo número es suficiente (raíz cuadrada inclusive, así que hace falta sustituir el menor por un menor o igual en el for).

ahora, para saber la raíz cuadrada de un número hace falta importar la biblioteca math.h, además de tener en cuenta al compilar, poner la opción "-lm", con lo que un ejemplo de compilación puede ser:

gcc -lm -o prueba prueba.c

y el programa quedaría de la siguiente manera:




#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void)
{
   int numero;
   int i;
   int es_primo;

   printf("Introduce el numero: ");
   fflush(stdout);
   if (scanf("%d", &numero) != 1 || numero < 2)
       return EXIT_FAILURE;

   es_primo = numero == 2 || numero % 2 == 1;
   for (i = 3; i <= sqrt(numero) && es_primo; i += 2)
       if (numero % i == 0)
           es_primo = 0;

    printf("%d %s primo\n", numero, (es_primo)?"es":"no es");

  return EXIT_SUCCESS;
}



Saludos

do-while

#26
¡Buenas!

Puestos a liarla:

#include <stdio.h>

int main(void)
{
    int numero;
    int i;
    int es_primo;

    printf("Introduce el numero: ");
    fflush(stdout);

    while(!scanf("%d", &numero))
        while(getchar() != '\n');

    for (es_primo = (numero > 1 && (numero == 2 || numero % 2 == 1)) , i = 2 ; i * i <= numero && (es_primo = (numero % i != 0)); i++);

    printf("%d %s primo\n", numero, es_primo ? "es" : "no es");

    return 0;
}


XD

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

rir3760

Hay que tener cuidado al utilizar el valor de retorno de scanf:
while(!scanf("%d", &numero))
   while(getchar() != '\n');

En caso de error o fin de archivo la funcion retorna EOF, eso causaria la salida del bucle con el valor de la variable "numero" como (todavia) "no definido" o "basura".

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