6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
1

Решето Эратосфена

30.11.2011, 02:04. Показов 3510. Ответов 8
Метки нет (Все метки)

Здравствуйте. Реализовал алгоритм "Решето Эратосфена" в виде класса.
Взгляните, пожалуйста, и скажите, где я не прав. Спасибо.

C++
1
2
3
4
5
6
7
8
class EratosphenesSieve
{
public:
    EratosphenesSieve( int );
    ~EratosphenesSieve();
private:
    bool *sieve;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cmath>
#include "EratosphenesSieve.h"
 
EratosphenesSieve::EratosphenesSieve( int n )
{
    n = abs( n );
    *sieve = new bool[ n + 1 ];
    
    for( int i = 0; i <= n; i++ )
        sieve[ i ] = true;
        
    for( int i = 2; i <= n; i++ )
        for( int k = i + 1; k <= n; k++ )
             if( k % i == 0 )
                 sieve[ k ] = false;                           
}
 
EratosphenesSieve::~EratosphenesSieve()
{
    delete [] sieve;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2011, 02:04
Ответы с готовыми решениями:

Решето Эратосфена
Подскажите реализацию (код) метода шифрования - решета Эратосфена, пожалуйста.

Решето Эратосфена
Возможно ли найти простые числа методом решета Эратосфена с помощью вектора за один проход? ...

Решето Эратосфена
В решете эратосфена из книги в условии есть непонятная вещь: if (i * 1ll * i &lt;= n) - возле единицы...

Решето Эратосфена
Простое число — это любое целое число, которое точно делится без остатка только само на себя и на...

8
Заблокирован
30.11.2011, 02:22 2
Цитата Сообщение от vortexx1 Посмотреть сообщение
Здравствуйте. Реализовал алгоритм "Решето Эратосфена" в виде класса.
Взгляните, пожалуйста, и скажите, где я не прав. Спасибо.

C++
1
2
3
4
5
6
7
8
class EratosphenesSieve
{
public:
    EratosphenesSieve( int );
    ~EratosphenesSieve();
private:
    bool *sieve;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cmath>
#include "EratosphenesSieve.h"
 
EratosphenesSieve::EratosphenesSieve( int n )
{
    n = abs( n );
    *sieve = new bool[ n + 1 ];
    
    for( int i = 0; i <= n; i++ )
        sieve[ i ] = true;
        
    for( int i = 2; i <= n; i++ )
        for( int k = i + 1; k <= n; k++ )
             if( k % i == 0 )
                 sieve[ k ] = false;                           
}
 
EratosphenesSieve::~EratosphenesSieve()
{
    delete [] sieve;
}
Сначала по определению самого класса. Если вы считаете, что вам должны указать неотрицательное число, то задавайте тип параметра как unsigned int. В вашем классе желательно хранить заданный размер последовательности целых чисел, чтобы знать, какая последовательность была рассмотрена.
Очевидно, что объект вашего класс не имеет смысла присваивать другому объекту вашего класса, так как не понятна семантика такого присваивания, а потому конструктор копирования и копирующий оператор присваивания лучше сделать закрытыми. Также желательно иметь два метода. первый возвращает размер вашей последовательности, а второй выводит на основе вашего логического массива те значения чисел, для которых вы получили значение true.

Поэтому я бы класс объявил следующим образом

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class EratosphenesSieve
{
public:
    EratosphenesSieve( unsigned int );
    ~EratosphenesSieve();
    unsigned int size() const;
    std::ostream & out( std::ostream & ) const;
private:
    bool *sieve;
    unsigned int n;
private:
    EratosphenesSieve( const EratosphenesSieve &  );
    EratosphenesSieve & operator =( const EratosphenesSieve & );
};
 
std::ostream & operator <<( std::ostream &os, const EratosphenesSieve &rhs )
{
   return ( rhs.out( os ) );
}
1
Эксперт С++
5035 / 2614 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
30.11.2011, 12:40 3
Цитата Сообщение от Сыроежка Посмотреть сообщение
то задавайте тип параметра как unsigned int.
Лучше все же size_t написать.
1
Эксперт С++
4264 / 2238 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
30.11.2011, 12:49 4
Сложность вашего алгоритма https://www.cyberforum.ru/cgi-bin/latex.cgi?O(n^2), а можно сделать https://www.cyberforum.ru/cgi-bin/latex.cgi?O(n\cdot sqrt{n})
1
Эксперт С++
5035 / 2614 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
30.11.2011, 13:25 5
Thinker, ты про это?
C
1
for( int i = 2; i <= n; i++ )
C
1
i * i <= n;
1
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
30.11.2011, 14:48  [ТС] 6
Начинать с квадрата числа, да + числа УЖЕ вычеркнутые можно не делить, а просто пропускать.
Спасибо за комментарии.
0
Эксперт С++
4264 / 2238 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
30.11.2011, 15:57 7
Цитата Сообщение от fasked Посмотреть сообщение
Thinker, ты про это?
C
1
for( int i = 2; i <= n; i++ )
C
1
i * i <= n;
Смотря как связать эти инструкции
0
Заблокирован
30.11.2011, 16:10 8
vortexx1, Вам просто надо начинать с проверки элемента 2 * исходный элемент и далее расмаатривать элементы i * исходный элемент < размер последовательности.
1
Эксперт С++
4264 / 2238 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
30.11.2011, 16:15 9
fasked, просто есть теорема в теории чисел, что достаточно бежать до https://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{n}, когда вычеркиваем элементы, кратные 2, 3,..., https://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{n}. При этом при вычеркивании элементов кратных k, целесообразнее шаг тоже сделать k.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.11.2011, 16:15
Помогаю со студенческими работами здесь

Решето Эратосфена
Как можно реализовать? Подскажите плиз

Решето Эратосфена
Кому надо - программа &quot;Решето Эратосфена&quot; на C++. Записывает в файл 1 000 000 первых простых чисел...

Решето Эратосфена
Написать функция для выполнения алгоритма решить Эратосфена! зарания спасибо!!!

Решето Эратосфена
В общем задание посчитать количество простых чисел до заданного числа N. Написал такой алгоритм,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru