Ver Mensaje Individual
  #9 (permalink)  
Antiguo 07/07/2014, 09:34
CalgaryCorpus
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Buscando números primos, con la criba de Eratóstenes

No me gusta que asignar un valor a una variable, por ejemplo

Código C++:
Ver original
  1. x = 1

tome mas tiempo que preguntar que valor tiene y luego asignarla, por ejemplo

Código C++:
Ver original
  1. if( x == 0 )
  2.    x = 1;

Pero el programa mostrado previamente es una muestra que este comportamiento se da, entonces, tomando partido de eso mismo, y otros cambios, se puede bajar aun mas el tiempo de ejecución

- nums en vez de hacerlo un arreglo de enteros, hacerlo un arreglo de bool
- Preguntar si ya se tiene el valor true, y solo asignárselo cuando no lo sea

Entonces la nueva versión queda así:

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define N 100000000 /* hasta aqui calculamos los primos */
  5.  
  6. int main() {
  7.   int i, j, x = 0;
  8.   int i2, sq = (int) (sqrt(N) + 1);
  9.   bool *nums  = (bool *) calloc( N+1, sizeof ( bool ));
  10.   int *prims = (int *) calloc( N+1, sizeof ( int ));
  11.   ///puts("\n\tSon PRIMOS:\n");
  12.   ///printf( "\t%4d:::%5d\n", x, 2 );
  13.   prims[x++] = 2;
  14.   for( i = 3; i <= N; i += 2 ) {
  15.     if( nums[i] )
  16.       continue;
  17.     prims[x] = i;
  18.     ///printf( "\t%4d:::%5d\n", x, i );
  19.     x++;
  20.     if( i > sq )
  21.       continue;
  22.     i2 = i + i;
  23.     for( j = i * i ; j <= N; j += i2) {
  24.       if( !nums[j] )
  25.           nums[j] = true;
  26.     }
  27.   }
  28.   ///for( i = 0; i < x; i ++ ) printf( "%4d", prims[i] );
  29.   printf("\n  Hasta %d hay %d numeros primos\n\n", N, x );
  30.   free ( nums );
  31.   free ( prims );
  32.   return 0;
  33. }

Y esta version deberia tomar menos tiempo que todas las anteriores... creo
Al menos en mis pruebas, asi es
__________________
Visita mi perfil en LinkedIn