En primer lugar, su código es corto y correcto, lo cual es muy bueno para principiantes. ;-)
Esto es lo que haría para mejorar el código:
1) Definir las variables dentro de los bucles, por lo que no se confunda con otra cosa. También haría que el límite sea un parámetro o una constante.
#define MAX 1000
for(int i=2;i<MAX;i++){
for(int j=2;j<i/j;j++){
if(!(i%j)) break;
if(j>(i/j)) cout<<i<<" is prime\n";
}
}
2) Me gustaría utilizar el Sieve of Eratosthenes, como Joey Adams y Mau han sugerido. Observe cómo no tengo que escribir el límite dos veces, por lo que los dos usos siempre serán idénticos.
#define MAX 1000
bool prime[MAX];
memset(prime, sizeof(prime), true);
for(int i=4;i<MAX;i+=2) prime[i] = false;
prime[1] = false;
cout<<2<<" is prime\n";
for(int i=3;i*i<MAX;i+=2)
if (prime[i]) {
cout<<i<<" is prime\n";
for(int j=i*i;j<MAX;j+=i)
prime[j] = false;
}
Los límites también son dignos de mención. i*i<MAX
es mucho más rápido que j > i/j
y tampoco es necesario marcar ningún número < i * i, porque ya estarán marcados, si son compuestos. Sin embargo, lo más importante es el time complexity.
3) Si realmente desea hacer que este algoritmo sea rápido, necesita caché para optimizarlo. La idea es encontrar primero todos los números primos < sqrt (MAX) y luego usarlos para encontrar el resto de los números primos . Luego puede usar el mismo bloque de memoria para encontrar todos los números primos desde 1024-2047, por ejemplo, y luego 2048-3071. Esto significa que todo se mantendrá en L1-caché. Una vez midí una aceleración de ~ 12 veces usando esta optimización en el Tamiz de Eratóstenes.
También puede reducir el uso de espacio a la mitad al no almacenar los números pares, lo que significa que no tiene que realizar los cálculos para comenzar a trabajar en un bloque nuevo tan a menudo.
Si es un principiante, probablemente debería olvidarse del caché por el momento.
no es entre 2 y 1000 es entre 1 y 1000 (el código incluye 2 pero excluye 1000) – Jacob
Lamentablemente, eres THX derecho – user377622
@Jacob - cuando se utilizan rangos medio abiertas (muy común en la programación) , "de 2 a 1000" incluye 2 pero excluye 1000. Es extraño que usted afirme un rango exclusivo: la mayoría de las personas al rechazar la mitad de abierto insistirán en un rango inclusivo (de 2 a 999). No es que esto marque la diferencia, ya que ni 1 ni 1000 son primos. – Steve314