Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

30.11.2011, 02:04. Просмотров 2419. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2011, 02:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Решето Эратосфена (C++):

Решето Эратосфена - C++
Возможно ли найти простые числа методом решета Эратосфена с помощью вектора за один проход? Добавлено через 1 минуту У меня...

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

Решето Эратосфена - 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. Простое число - число, которое может быть разделено...

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
fasked
Эксперт С++
4963 / 2543 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.11.2011, 12:40 #3
Цитата Сообщение от Сыроежка Посмотреть сообщение
то задавайте тип параметра как unsigned int.
Лучше все же size_t написать.
1
Thinker
Эксперт С++
4231 / 2205 / 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})
1
fasked
Эксперт С++
4963 / 2543 / 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;
1
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
30.11.2011, 14:48  [ТС] #6
Начинать с квадрата числа, да + числа УЖЕ вычеркнутые можно не делить, а просто пропускать.
Спасибо за комментарии.
0
Thinker
Эксперт С++
4231 / 2205 / 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;
Смотря как связать эти инструкции
0
Сыроежка
Заблокирован
30.11.2011, 16:10 #8
vortexx1, Вам просто надо начинать с проверки элемента 2 * исходный элемент и далее расмаатривать элементы i * исходный элемент < размер последовательности.
1
Thinker
Эксперт С++
4231 / 2205 / 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.
1
30.11.2011, 16:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2011, 16:15
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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