2013-07-03 3 views
0

J'essaie de trouver le nombre premier dans une liste en utilisant le Sieve of Eratosthenes. J'ai essayé ceci:itération à travers une liste de changement avec Linq

var primeNumber = new List<int>(Enumerable.Range(2, max - 1)); 
primeNumber.ForEach(m => primeNumber.RemoveAll(n => n % m == 0)); 

mais ça n'a pas marché puisque vous ne pouvez pas itérer sur une liste qui est en train de changer. Existe-t-il un meilleur moyen que de créer un autre tableau et de l'itérer, puisque je n'ai besoin que d'itérer le nombre premier? Avec le deuxième tableau, je supprimerais tout ce qui peut être divisé par 2 puis enlèverai tout ce qui peut être divisé par 4 (il ne devrait y en avoir aucun) et ainsi de suite ...

Merci déjà pour vos réponses.

+0

N'utilisez pas de listes pour le tamis des ératosthènes, utilisez des matrices de bits. – starblue

Répondre

0

J'ai choisi de le faire de cette façon:

double maxFactor = Math.Sqrt(primeNumber.Max()); 
while (factor <= maxFactor) 
{ 
    factor = primeNumber.First(n => n > factor); 
    primeNumber.RemoveAll(n => n != factor && n % factor == 0); 
} 

Il travaille et encore assez rapide et propre.

0

Vous devriez probablement simplement copier les nombres dans un nouveau tableau et faire le ForEach là-dessus. Je ne pense pas qu'il y ait un meilleur moyen.

Questions connexes