Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
8 / 8 / 4
Регистрация: 23.04.2014
Сообщений: 59
1

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

09.05.2014, 14:42. Показов 3620. Ответов 4
Метки нет (Все метки)

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

а) Создайте массив, все элементы которого имеют начальные значения 1 (истина). Элементы массива с простыми индексами останутся равными 1. Все другие элементы массива, в конечном счете, установятся равными нулю.

b) Начиная с индекса массива 2 (индекс 1 должен быть простым), каждый раз отыскивается элемент массива с единичным значением, циклически обрабатывается оставшаяся часть массива и устанавливается в нуль каждый элемент массива, чей индекс кратен индексу элемента с единичным значением. Для индекса 2 все элементы в массиве с большим чем 2 индексом и кратные 2 установятся равными нулю (индексы 4, 6, 8 и тому подобные); для индекса 3 все элементы с индексом свыше 3 и кратные 3, установятся равными нулю (индексы 6, 9, 12 и тому подобные) и т.д. Когда процесс закончится, элементы массива с единичным значением
указывают, что их индексы — простые числа. Эти индексы могут быть напечатаны.

Напишите программу, которая использует массив с 1000 элементами для определения и печати простых чисел между 1 и 999. Элемент 0 массива во внимание не принимайте.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int main()
{
    int arraySize = 101;        //пока возьмем 100 элементов для пробы
    int a[ arraySize ];   
    int j;
 
    for( int i = 0; i < arraySize; i++ )        //Установка всех эл.
    {                                             //  равными 1
        a[ i ] = 1;
    }
 
    for( int i = 2; i < arraySize; i++ )
    {
        j = i;
 
        for( j; j < arraySize; j++ )        //Если число простое - оставляем 1,
        {                                   //если нет - ставим 0.
            if( i % ( j + 1) == 0 )
                a[ j + 1 ] = 0;
            else                
                continue;
        }
    }
 
    for( int h = 1; h < arraySize; h++ )    //Вывод результата на экран
        cout << h << setw( 5 ) << a[ h ] << endl;
   return 0;
}
В результате появляется список индексов, которые все до единого равны "1". В чем ошибка?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2014, 14:42
Ответы с готовыми решениями:

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

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

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

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

4
176 / 144 / 70
Регистрация: 01.05.2012
Сообщений: 414
09.05.2014, 15:02 2
Лучший ответ Сообщение было отмечено randy92 как решение

Решение

randy92,
так вот вроде правильно)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
{
    int arraySize = 101;        //пока возьмем 100 элементов для пробы
    int a[ arraySize ];
    int j;
 
    for( int i = 0; i < arraySize; i++ )        //Установка всех эл.
    {                                             //  равными 1
        a[ i ] = 1;
    }
 
    for( int i = 2; i < arraySize; i++ )
    {
        j = i+1;
        for( j; j < arraySize; j++ )        //Если число простое - оставляем 1,
        {                                   //если нет - ставим 0.
            if( j%i == 0 )
                a[ j ] = 0;
            else
                continue;
        }
    }
 
    for( int h = 1; h < arraySize; h++ )    //Вывод результата на экран
        cout << h << setw( 5 ) << a[ h ] << endl;
   return 0;
}
Добавлено через 34 секунды
Не тот остаток проверяли)
0
8 / 8 / 4
Регистрация: 23.04.2014
Сообщений: 59
09.05.2014, 15:03  [ТС] 3
верно, спасибо) почему мой код не работал корректно?
0
382 / 276 / 478
Регистрация: 09.05.2014
Сообщений: 769
09.05.2014, 15:07 4
if( ( j + 1)%i == 0 ) а не if( i%( j + 1) == 0 ). ты сравнивал неачальный индекс с последующими, в результате остаток от деления всегда не равен нулю- условие не выполняется.
0
176 / 144 / 70
Регистрация: 01.05.2012
Сообщений: 414
09.05.2014, 15:10 5
Цитата Сообщение от randy92 Посмотреть сообщение
почему мой код не работал корректно?
я написал) ты не тот остаток находил) надо было местами поменять)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2014, 15:10

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

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

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

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


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

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

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