Advertisement
smatskevich

PrimesWithIntVector

Mar 1st, 2017
372
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1. #include <assert.h>
  2. #include <iostream>
  3.  
  4. class CIntVector {
  5. public:
  6.     CIntVector( int _size );
  7.     CIntVector( const CIntVector& other );
  8.     ~CIntVector() { delete data; }
  9.  
  10.     // Размер массива.
  11.     int Size() const { return size; }
  12.  
  13.     // Операторы доступа к элементам по индексу.
  14.     // Константный оператор возвращает копию элемента.
  15.     int operator[]( int index ) const;
  16.     // Неконстантный оператор возвращает ссылку на элемент.
  17.     int& operator[]( int index );
  18.  
  19. private:
  20.     int* data;
  21.     int size;
  22. };
  23.  
  24. CIntVector::CIntVector( int _size ) :
  25.     size( _size )
  26. {
  27.     if( size == 0 ) {
  28.         data = 0;
  29.     } else {
  30.         data = new int[size];
  31.     }
  32. }
  33.  
  34. CIntVector::CIntVector( const CIntVector& other )
  35. {
  36.     size = other.size;
  37.     data = new int[size];
  38.     ::memmove( data, other.data, size * sizeof( int ) );
  39. }
  40.  
  41. int CIntVector::operator[]( int index ) const
  42. {
  43.     assert( index >= 0 );
  44.     assert( index < size );
  45.     return data[index];
  46. }
  47.  
  48. int& CIntVector::operator[]( int index )
  49. {
  50.     assert( index >= 0 );
  51.     assert( index < size );
  52.     return data[index];
  53. }
  54.  
  55. // Возвращает массив простых чисел до n.
  56. CIntVector GetPrimes( int n )
  57. {
  58.     assert( n > 0 );
  59.  
  60.     // Выделим массив под решето Эратосфена.
  61.     bool* sieve = new bool[n + 1];
  62.     for( int i = 0; i <= n; ++i ) {
  63.         sieve[i] = true;
  64.     }
  65.  
  66.     sieve[0] = false;
  67.     sieve[1] = false;
  68.  
  69.     int primesCount = 0;
  70.     // Выкалываем числа, кратные простым.
  71.     for( int prime = 2; prime <= n; ++prime ) {
  72.         if( !sieve[prime] ) {
  73.             continue;
  74.         }
  75.         ++primesCount;
  76.         for( int k = 2; k * prime <= n; ++k ) {
  77.             sieve[k * prime] = false;
  78.         }
  79.     }
  80.  
  81.     CIntVector primes( primesCount );
  82.     int currentIndex = 0;
  83.     for( int i = 2; i <= n; ++i ) {
  84.         if( sieve[i] ) { // Осталось не выколото => простое.
  85.             primes[currentIndex++] = i;
  86.         }
  87.     }
  88.  
  89.     delete[] sieve;
  90.  
  91.     return primes;
  92. }
  93.  
  94. int main()
  95. {
  96.     int n = 0;
  97.     std::cin >> n;
  98.  
  99.     const CIntVector primes = GetPrimes( n );
  100.  
  101.     for( int i = 0; i < primes.Size(); ++i ) {
  102.         std::cout << primes[i] << " ";
  103.     }
  104.     return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement