Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.95
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
#1

Решето Эратосфена - C++

30.11.2011, 02:04. Просмотров 2353. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2011, 02:04     Решето Эратосфена
Посмотрите здесь:

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

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

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

Решето Эратосфена - C++
Дано число N (2&lt;=N &lt;=10000), найдите и выведите простые числа между 2 и данным N. Простое число - число, которое может быть разделено...

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
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 ) );
}
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.11.2011, 12:40     Решето Эратосфена #3
Цитата Сообщение от Сыроежка Посмотреть сообщение
то задавайте тип параметра как unsigned int.
Лучше все же size_t написать.
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
30.11.2011, 12:49     Решето Эратосфена #4
Сложность вашего алгоритма http://www.cyberforum.ru/cgi-bin/latex.cgi?O(n^2), а можно сделать http://www.cyberforum.ru/cgi-bin/latex.cgi?O(n\cdot sqrt{n})
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.11.2011, 13:25     Решето Эратосфена #5
Thinker, ты про это?
C
1
for( int i = 2; i <= n; i++ )
C
1
i * i <= n;
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
30.11.2011, 14:48  [ТС]     Решето Эратосфена #6
Начинать с квадрата числа, да + числа УЖЕ вычеркнутые можно не делить, а просто пропускать.
Спасибо за комментарии.
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 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;
Смотря как связать эти инструкции
Сыроежка
Заблокирован
30.11.2011, 16:10     Решето Эратосфена #8
vortexx1, Вам просто надо начинать с проверки элемента 2 * исходный элемент и далее расмаатривать элементы i * исходный элемент < размер последовательности.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2011, 16:15     Решето Эратосфена
Еще ссылки по теме:

Решето Эратосфена - C++
Определить простые числа методом просеивания с помощью &lt;&lt;решета Эратосфена&gt;&gt; с _битовой упаковкой_ данных при сохранении. #include...

Решето Эратосфена с графикой - C++
Нужно сделать решето эратосфена, с введением чисел от 2 до N, и чтобы выводил все числа и вычеркивал, не знаю как это реализовать, знания...

Простые числа. Решето Эратосфена - C++
Здравствуйте! Нужна ваша помощь, не могу понять условие этой задачи: Даны натуральное число n, целые числа a1,.....,an. Рассмотреть...

Решето Эратосфена. Как ускорить? - C++
Этот код не проходит задачу. доля секунды. как ускорить. или каким методом проидет #include &lt;bits/stdc++.h&gt; using namespace std; ...

Определить количество простых чисел, меньших N, используя решето Эратосфена - C++
Дан код: #include &lt;iostream&gt; using namespace std; static const int N = 1000; int main() { int i, a; for (i = 2; i &lt; N; i++)...


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

Или воспользуйтесь поиском по форуму:
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
30.11.2011, 16:15     Решето Эратосфена #9
fasked, просто есть теорема в теории чисел, что достаточно бежать до http://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{n}, когда вычеркиваем элементы, кратные 2, 3,..., http://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{n}. При этом при вычеркивании элементов кратных k, целесообразнее шаг тоже сделать k.
Yandex
Объявления
30.11.2011, 16:15     Решето Эратосфена
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru