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

Existe una correccion y unas optimizaciones posibles aun:
- nums deberia inicializarse, de otro modo la instruccion que compara su contenido (linea 9 en el post mostrado previamente) se encontrará con basura.
- El ciclo al interior multiplica 2 veces, una para comparar (linea 11), otra para asignar (linea 12).
Este par de multiplicaciones se puede reemplazar por 1 suma, debido a que el ciclo lo que hace es calcular los factores del numero i, es decir calcula 2*i, 3*i, 4*i, ... ( y asi sucesivamente ) y ese valor utiliza.

En vez de multiplicar todas las veces, se puede guardar el valor anterior y descubrir el siguiente sólo sumando i, asi (ver variable "multiplo"):

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <memory.h>
  3. #define N 100 /* hasta aqui calculamos los primos */
  4.  
  5. int main() {
  6.   int i, multiplo, nums[N+1],  x = 1;
  7.   // Importante inicializar el arreglo de marcas
  8.   memset( nums, 0, (N + 1) * sizeof(int) );
  9.   puts("\n\tSon PRIMOS:\n");
  10.   printf( "\t%4d:::%5d\n", x++, 2 );
  11.   for( i = 3; i <= N; i += 2 ) {
  12.     if( nums[i] == 0 ) {
  13.        printf( "\t%4d:::%5d\n", x++, i );
  14.        for( multiplo = i+i; multiplo <= N; multiplo += i ) {
  15.             nums[multiplo] = 1;
  16.        }
  17.     }
  18.   }
  19.  
  20.   printf("\n  Hasta %d hay %d numeros primos\n", N, --x);
  21.   return 0;
  22. }

Se puede ver en ejecucion aqui: http://goo.gl/SqVW20
__________________
Visita mi perfil en LinkedIn