Advertisement
smatskevich

Eratosthenes

Sep 5th, 2016
469
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.31 KB | None | 0 0
  1. #include <iostream>
  2. #include <assert.h>
  3. using std::cin;
  4. using std::cout;
  5.  
  6. // Возвращает массив простых чисел в диапазоне [1..n].
  7. // Последний элемент в массиве - 0.
  8. int* FindPrimes( int n )
  9. {
  10.     assert( n >= 1 );
  11.     bool* numbers = new bool[n + 1]; // 0-ой не используем.
  12.     // Инициализация.
  13.     for( int i = 0; i <= n; ++i ) {
  14.         numbers[i] = true;
  15.     }
  16.     numbers[1] = false;
  17.     // Основной проход.
  18.     for( int i = 2; i < n; ++i ) {
  19.         for( int j = 2; j * i <= n; ++j ) {
  20.             numbers[j * i] = false;
  21.         }
  22.     }
  23.     // Вычислим количество простых.
  24.     int primesCount = 0;
  25.     for( int i = 1; i <= n; ++i ) {
  26.         if( numbers[i] ) {
  27.             ++primesCount;
  28.         }
  29.     }
  30.     // Заполняем массив простых.
  31.     // Выделяем также место и для последнего 0.
  32.     int* primes = new int[primesCount + 1];
  33.     int primesPos = 0;
  34.     for( int i = 1; i <= n; ++i ) {
  35.         if( numbers[i] ) {
  36.             primes[primesPos] = i;
  37.             primesPos++;
  38.         }
  39.     }
  40.     primes[primesCount] = 0;
  41.     delete[] numbers;
  42.     return primes;
  43. }
  44.  
  45. int main()
  46. {
  47.     int n = 0;
  48.     cin >> n;
  49.  
  50.     int* primes = FindPrimes( n );
  51.  
  52.     for( int i = 0; primes[i] != 0; ++i ) {
  53.         cout << primes[i] << " ";
  54.     }
  55.  
  56.     delete[] primes;
  57.     return 0;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement