Решето Ератосфена#4739

Решето Ератосфена (Розбір)

Використовуючи алгоритм решета Ератосфена, заповнимо масив , в якому

Виведемо всі числа на проміжку від до , для яких primes[i] = 1.

Приклад

Заповнений масив має вигляд:

Простими числами на проміжку будуть 2, 3, 5, 7.

Реалізація алгоритму

Оголосимо робочий масив .

#define MAX 100001
int primes[MAX];

Функція gen_primes реалізує решето Ератосфена. Заповнюємо масив . Числа та не прості.

void gen_primes(void)
{
  int i, j;
  for (i = 0; i < MAX; i++) primes[i] = 1;
  primes[0] = primes[1] = 0;
  for (i = 2; i * i <= MAX; i++)
    if (primes[i])
      for (j = i * i; j < MAX; j += i) primes[j] = 0;
}

Основна частина програми. Заповнюємо масив .

gen_primes();

Читаємо вхідні дані.

scanf("%d %d", &a, &b);

Виводимо всі прості числа від до .

for (i = a; i <= b; i++)
  if (primes[i]) printf("%d ", i);
printf("\n");

Реалізація алгоритму — bitset

Оголосимо змінну типу bitset для зберігання інформації про прості числа.

#define MAX 100001
bitset<MAX> primes;

Функція gen_primes реалізує решето Ератосфена. Заповнюємо масив . Числа та не прості.

void gen_primes(void)
{
  primes.flip(); // set all to 1
  primes.reset(0); primes.reset(1);
  for (int i = 2; i <= sqrt(MAX); i++)
    if (primes.test(i))
      for (int j = i * i; j < MAX; j += i) primes.reset(j);
}

Основна частина програми. Заповнюємо масив .

gen_primes();

Читаємо вхідні дані.

scanf("%d %d", &a, &b);

Виводимо всі прості числа від до .

for (i = a; i <= b; i++)
  if (primes.test(i)) printf("%d ", i);
printf("\n");

Java реалізація

import java.util.*;

public class Main 
{
  final static int MAX_SIZE = 100001;
  static BitSet bits = new BitSet(MAX_SIZE);
   
  public static void Eratosthenes()
  {
    bits.set(2, MAX_SIZE, true);
    for (int i = 2; i < Math.sqrt(MAX_SIZE); i++)
    {
      if (bits.get(i))
        for (int j = i * i; j < MAX_SIZE; j += i)
          bits.set(j, false);
    }
  }
	 
  public static void main(String args[]) 
  {
    Scanner con = new Scanner(System.in);
    Eratosthenes();
    int a = con.nextInt();
    int b = con.nextInt();
    for (int i = a; i <= b; i++)
      if (bits.get(i)) System.out.print(i + " ");
    System.out.println();
    con.close();
  }
}

Python реалізація

Функція seive_of_eratosthenes реалізує решето Ератосфена. Заповнюємо і повертаємо список is_prime. Числа та не прості.

def seive_of_eratosthenes(n):
  is_prime = [True] * (n+1)
  is_prime[0], is_prime[1] = False, False

  for i in range(2, int(n ** 0.5) + 1):
    if is_prime[i]:
      for j in range(i * i, n + 1, i):
        is_prime[j] = False

  return is_prime

Основна частина програми. Заповнюємо масив .

prime = seive_of_eratosthenes(100000)

Читаємо вхідні дані.

a, b = map(int, input().split())

Виводимо всі прості числа від до .

for i in range (a, b + 1):
  if prime[i]: print(i,end=' ')