Найти простые числа используя решето Эратосфена и однонаправленный список - C#
Формулировка задачи:
Дано натуральное число n (n≥2). Найти все меньшие n простые числа, используя решето Эратосфена. Решетом Эратосфена называют следующий способ. Выпишем подряд все целые числа от 2 до n. Первое простое число 2. Подчеркнем его, а все большие числа, кратные 2, зачеркнем. Первое из оставшихся чисел 3. Подчеркнем его как простое, а все большие числа, кратные, 3, зачеркнем. Первое число из оставшихся теперь 5, так как 4 уже зачеркнуто. Подчеркнем его как простое, а все большие числа, кратные 5 зачеркнем и т.д.:2, 3, 4,5, 6,7, 8, 9, 10, ... Исходную последовательность чисел организовать в виде однонаправленного списка. Удаление производить внутри этого списка, не используя дополнительные списки.
Администрация и модераторы не удаляйте эту Тема пожалуйста, да на нее ответили, но не правильно!
Помогите пожалуйста написать программу не на Basic, а на C# ибо показывал код преподу она сказала что он на Basic, а надо было на c#. Заранее спасибо
Решение задачи: «Найти простые числа используя решето Эратосфена и однонаправленный список»
textual
Листинг программы
- class Node<T>
- {
- public Node<T> Next;
- public T Value;
- }
- class SingleLinkedList<T>: IEnumerable<T>
- {
- public class Iterator: IEnumerator<T>
- {
- private Node<T> _node;
- private SingleLinkedList<T> _list;
- public Iterator(SingleLinkedList<T> list)
- {
- _list = list;
- }
- public bool MoveNext()
- {
- if (_node == null)
- {
- _node = _list.Head;
- }
- else
- {
- _node = _node.Next;
- }
- return _node != null;
- }
- public void Reset()
- {
- _node = null;
- }
- public void Dispose() { _node = null; }
- public T Current => _node.Value;
- object IEnumerator.Current => Current;
- }
- public IEnumerator<T> GetEnumerator()
- {
- return new Iterator(this);
- }
- IEnumerator IEnumerable.GetEnumerator()
- {
- return GetEnumerator();
- }
- private Node<T> _head;
- private Node<T> _tail;
- public Node<T> Head => _head;
- public void PushBack(T value)
- {
- var node = new Node<T> { Value = value };
- if (_tail == null)
- {
- _head = _tail = node;
- return;
- }
- _tail.Next = new Node<T> { Value = value };
- _tail = _tail.Next;
- }
- public void Remove(Node<T> node)
- {
- if (node == _head)
- {
- if (node == _tail)
- {
- _head = _tail = null;
- }
- else
- {
- _head = _head.Next;
- }
- return;
- }
- var curr = _head;
- while (curr.Next != node)
- {
- curr = curr.Next;
- }
- curr.Next = node.Next;
- if (_tail == node)
- {
- _tail = curr;
- }
- }
- }
- void ApplyEratosthenesSieveIteration(SingleLinkedList<int> list, Node<int> start)
- {
- var curr = start;
- var prime = start.Value;
- while (curr != null)
- {
- var next = curr.Next;
- if (curr.Value > prime && curr.Value % prime == 0)
- {
- list.Remove(curr);
- }
- curr = next;
- }
- }
- void ApplyEratosthenesSieve(SingleLinkedList<int> list)
- {
- var start = list.Head;
- while (start != null)
- {
- ApplyEratosthenesSieveIteration(list, start);
- start = start.Next;
- }
- }
- void Main()
- {
- var list = new SingleLinkedList<int>();
- for (int i = 2; i < 100; i++)
- {
- list.PushBack(i);
- }
- ApplyEratosthenesSieve(list);
- foreach (var e in list)
- {
- Console.WriteLine(e);
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д