codigo para calcular los numeros primos

Iniciado por minari02, 24 Diciembre 2013, 01:00 AM

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

leosansan

Cita de: amchacon en 27 Diciembre 2013, 22:43 PM
.........................................................
Pero aún así es más eficiente, entre otras cosas porque no tienes llamadas a función y esas cosas. El algoritmo es el mismo básicamente.
El problema esque yo meto los datos en la pila y tú usas memoria dinámica (malloc).
.............................................................

El mismo código tuyo, con mis modificaciones en cuanto a ir de dos en dos, y manteniendo el uso de la pila así como de las funciones es similar al mío:


Código (cpp) [Seleccionar]

#include <stdio.h>
#define COMPUESTO 0

const int MAX = 1000000;

void tacharMultiplos(char Tabla[],int i)
{
    int j;
    for (j = i;(i*j) <= MAX;j+=2)
    {
        Tabla[j*i] = COMPUESTO;
    }
}

void mostrarTabla(char Tabla[])
{
    int i = 3,cont=1;

    for (i = 3; i <= MAX;i+=2)
    {
        if (Tabla[i] != COMPUESTO)
        {
            /*printf("%d  ",Tabla[i]);*/
            cont++;
        }

    }

    printf("\ncont= %d\n",cont);
}

int main()
{
    // Generar Criba de erastotenes

    char Tabla[MAX+1]; // tabla booleana
    int i = 0;

    // valor inicial

    for (i = 3; i<= MAX;i++)
    {
        Tabla[i] = i;
    }
       

    for (i = 3;i*i<=MAX;i+=2)
    {
            tacharMultiplos(Tabla,i);
    }

    mostrarTabla(Tabla);
    return 0;
}


Eso sí, creo que el uso de la pila penaliza el tamaño del array ya que en mi caso puedo llegar a 10^8 y en el tuyo a 10^6, al menos en mi ordenador.

Y como verás he respetado el uso que haces de las llaves ..... que se me antoja excesivo.  ;) ;) ;)



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

:rolleyes: ;) ;) ;) :rolleyes:

amchacon

#31
Cita de: leosansan en 28 Diciembre 2013, 10:55 AMEl problema no es imprimir 10^18, que si lo acepta, sino que a partir de 10^9 malloc no lo acepta
Malloc recibe un argumento de tipo size_t, el valor máximo que puede alcanzar está definido con la macro SIZE_MAX (definida en stdint.h). Normalmente suele tener el valor de un unsigned long long (2^64-1).

El problema no está en malloc. El problema son estos dos:

- Estás pidiendo memoria de forma contigua es muy posible que tengas 1 gb libre de memoria ram, el problema esque la memoria libre estará "dispersa". Es muy díficil que te encuentres 1 gb de espacio libre contiguo. Se podría suplir esto usando listas o varios vectores.
- En una aplicación de 32 bits, la máxima memoria permitida es de 2GB (si la compilas en 64 bits llegarías a los 16 tb)

Cita de: leosansan en 28 Diciembre 2013, 14:55 PM..
Y como verás he respetado el uso que haces de las llaves ..... que se me antoja excesivo.  ;) ;) ;)[/size]
Pues efectivamente, era por saltase iteraciones... Y porque el if que he puesto sobraba  :silbar:

Y no soy tan nazi con las llaves xD. Ahí son pocas sentencias y se ve bastante claro. Yo lo hubiera identado de otra forma:
Código (cpp) [Seleccionar]
#include <stdio.h>
#define COMPUESTO 0

const int MAX = 1000000;

void tacharMultiplos(char Tabla[],int i)
{
   int j;

   for (j = i; (i*j) <= MAX; j+=2)
       Tabla[j*i] = COMPUESTO;
}

void mostrarTabla(char Tabla[])
{
   int i = 3,cont=1;

   for (i = 3; i <= MAX; i+=2)
       if (Tabla[i] != COMPUESTO) cont++;

   printf("\ncont= %d\n",cont);
}

int main()
{
   // Generar Criba de erastotenes

   char Tabla[MAX+1]; // tabla booleana
   int i = 0;

   // valor inicial

   for (i = 3; i<= MAX; i++)   Tabla[i] = i;
   for (i = 3; i*i<=MAX; i+=2)   tacharMultiplos(Tabla,i);

   mostrarTabla(Tabla);
   return 0;
}
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

Cita de: amchacon en 28 Diciembre 2013, 16:06 PM
.....................................................

El problema no está en malloc. El problema son estos dos:

- Estás pidiendo memoria de forma contigua es muy posible que tengas 1 gb libre de memoria ram, el problema es que la memoria libre estará "dispersa". Es muy díficil que te encuentres 1 gb de espacio libre contiguo. Se podría suplir esto usando listas o varios vectores.
- En una aplicación de 32 bits, la máxima memoria permitida es de 2GB (si la compilas en 64 bits llegarías a los 16 tb)
......................................

;-) ;-) ;-) Seré pardillo ........ mi memoria es la que si falla.

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

:rolleyes: ;) ;) ;) :rolleyes: