Prima di tutto, il codice è sia breve che corretto, il che è molto buono per principianti. ;-)
Questo è quello che vorrei fare per migliorare il codice:
1) Definire le variabili all'interno dei cicli, in modo da non confondersi con qualcos'altro. Vorrei anche rendere il limite un parametro o una costante.
#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) Vorrei utilizzare il Sieve of Eratosthenes, come Joey Adams e Mau hanno suggerito. Nota come non devo scrivere il limite due volte, quindi i due usi saranno sempre identici.
#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;
}
I limiti sono anche degni di nota. i*i<MAX
è molto più veloce di j > i/j
e inoltre non è necessario contrassegnare alcun numero < i * i, perché saranno già stati contrassegnati, se sono compositi. La cosa più importante è la time complexity però.
3) Se si desidera veramente rendere questo algoritmo veloce, è necessario memorizzarlo nella cache. L'idea è di trovare prima tutti i numeri primi < sqrt (MAX) e quindi usarli per trovare il resto dei numeri primi . Quindi è possibile utilizzare lo stesso blocco di memoria per trovare tutti i numeri primi da 1024-2047, ad esempio e quindi 2048-3071. Ciò significa che tutto sarà conservato nella cache L1. Una volta ho misurato un'accelerazione di ~ 12 volte usando questa ottimizzazione sul setaccio di Eratostene.
È anche possibile ridurre l'utilizzo dello spazio a metà non memorizzando i numeri pari, il che significa che non è necessario eseguire i calcoli per iniziare a lavorare su un nuovo blocco più spesso.
Se sei un principiante, dovresti probabilmente dimenticarti della cache per il momento.
non è compreso tra 2 e 1000 è compreso tra 1 e 1000 (il codice include 2 ma esclude 1000) – Jacob
Ops, tu sei thx destra – user377622
@Jacob - quando si utilizzano gli intervalli semiaperte (molto comune in programmazione) , "da 2 a 1000" è inteso per includere 2 ma escludere 1000. Strano che si asserisca un intervallo esclusivo - la maggior parte delle persone che rifiutano di aprire a metà aprirà una gamma inclusiva (da 2 a 999). Non che tutto ciò faccia la differenza, poiché né 1 né 1000 sono primi. – Steve314