2013-07-03 2 views
0

Я пытаюсь найти простое число в списке, используя Sieve of Eratosthenes. Я попытался это:Итерация через меняющийся список с Linq

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

, но он не работает, так как вы не можете итерацию по списку, который меняется. Есть ли лучший способ, чем создание другого массива и итерация через него, поскольку мне нужно только перебирать пронумерованное число? Со вторым массивом я бы удалил все, что можно разделить на 2, а затем удалить все, что можно разделить на 4 (их не должно быть) и т. Д.

Спасибо, что уже за ваши ответы.

+0

Не используйте списки для сита Эратосфена, используйте бит-массивы. – starblue

ответ

0

Я решил сделать это таким образом:

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

Он работает и по-прежнему довольно быстро и чисто.

0

Возможно, вы должны просто скопировать числа в новый массив и сделать ForEach. Я не думаю, что есть лучший способ.

Смежные вопросы