Cita de: leosansan en 24 Diciembre 2013, 15:03 PMNo hace falta usar la librería math.h, estamos hablando de la raiz entera:
El caso es si sabe donde se pone la raíz cuadrada. Y no olvidarse de incluir la librería math.h.
Código (c) [Seleccionar]
for (i = 2; (i*i) <= n;i++)
Cita de: leosansan en 24 Diciembre 2013, 15:03 PMA 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 (c) [Seleccionar]
#include <stdio.h>
#define PRIMO 1
#define COMPUESTO 0
#define NO_DEFINIDO -1
const int MAX = 120;
void tacharMultiplos(char Tabla[],int N)
{
int i;
for (i = 2;(N*i) <= MAX;i++)
{
Tabla[N*i] = COMPUESTO;
}
}
void mostrarTabla(char Tabla[])
{
int i = 2;
for (; i <= MAX;i++)
if (Tabla[i] == PRIMO) printf("%d\n",i);
}
int main()
{
// Generar Criba de erastotenes
char Tabla[MAX+1]; // tabla booleana
int i = 0;
// valor inicial
for (; i<= MAX;i++) Tabla[i] = NO_DEFINIDO;
for (i = 2;i<=MAX;i++)
{
if (Tabla[i] == NO_DEFINIDO) // si no esta inicializada...
{
Tabla[i] = PRIMO;
tacharMultiplos(Tabla,i);
}
}
mostrarTabla(Tabla);
return 0;
}
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 (c) [Seleccionar]
scanf("%d",&numero);
if (numero < max)
{
if (Tabla[numero]) puts("Es primo");
else puts("Es compuesto");
}
else
{
if (esPrimo(numero)) puts("Es primo");
else puts("Es compuesto");
}