Ver Mensaje Individual
  #8 (permalink)  
Antiguo 04/07/2014, 23:18
Avatar de leosansan
leosansan
 
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: Buscando números primos, con la criba de Eratóstenes

Cita:
Iniciado por CalgaryCorpus Ver Mensaje
.........................................
Pienso que si se implementa haciendo suposiciones (como que los números pares no son primos (lo que es cierto, pero la idea del método es justamente hacer estos descartes en medio del funcionamiento, no en la implementación)), ya no se está enfrente de la implementación de ese método, sino de una optimización que el señor Eratostenes reclamaría como "impura"
.................................
.

Ahora me has convencido, ya había usado lo de sqrt en la clásica función esPrimo pero se me había pasado aquí.

Sólo quedaría por mejorar el que no "tache" más de una vez un número. Pero eso ya es otra historia....

¡Pero que diablos!, que todo sea por unas décimas de menos:

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, repes = 0;
  8.   int i2, sq = (int) (sqrt(N) + 1);
  9.   int *nums  = (int *) calloc( N+1, sizeof ( int ));
  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.   x++;
  15.   for( i = 3; i <= N; i += 2 ) {
  16.     if( nums[i] )
  17.       continue;
  18.     prims[x] = i;
  19.     ///printf( "\t%4d:::%5d\n", x, i );
  20.     x++;
  21.     if( i > sq )
  22.       continue;
  23.     i2 = i + i;
  24.     for( j = i * i ; j <= N; j += i2) {
  25.       nums[j] ++;
  26.       if ( nums[j] > 1 )
  27.         repes += nums[j]-1;
  28.         ///printf( "\ti=%4d:::j=%5d   nums[%3d] = %2d\n", i, j,j,nums[j] );
  29.       while( ( j + i2 ) <= N && (nums[ j + i2 ] == 1 ) )
  30.           j += i2;
  31.     }
  32.   }
  33.   ///for( i = 0; i < x; i ++ ) printf( "%4d", prims[i] );
  34.   printf("\n  Hasta %d hay %d numeros primos   repetidos = %d\n\n", N, x, repes);
  35.   free ( nums );
  36.   free ( prims );
  37.   return 0;
  38. }



Y otra vez gracias por la atención prestada.

¡¡¡Saluditos!!!


Última edición por leosansan; 05/07/2014 a las 13:42