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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
randy92
7 / 7 / 2
Регистрация: 23.04.2014
Сообщений: 59
09.05.2014, 14:42     Решето Эратосфена #1
Простое число — это любое целое число, которое точно делится без остатка только само на себя и на 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". В чем ошибка?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2014, 14:42     Решето Эратосфена
Посмотрите здесь:

Решето Эратосфена C++
C++ Решето Эратосфена
Решето Эратосфена C++
Решето Эратосфена C++
Решето Эратосфена C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
_script_
169 / 137 / 34
Регистрация: 01.05.2012
Сообщений: 414
09.05.2014, 15:02     Решето Эратосфена #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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 секунды
Не тот остаток проверяли)
randy92
7 / 7 / 2
Регистрация: 23.04.2014
Сообщений: 59
09.05.2014, 15:03  [ТС]     Решето Эратосфена #3
верно, спасибо) почему мой код не работал корректно?
lawr
 Аватар для lawr
339 / 233 / 114
Регистрация: 09.05.2014
Сообщений: 723
09.05.2014, 15:07     Решето Эратосфена #4
if( ( j + 1)%i == 0 ) а не if( i%( j + 1) == 0 ). ты сравнивал неачальный индекс с последующими, в результате остаток от деления всегда не равен нулю- условие не выполняется.
_script_
169 / 137 / 34
Регистрация: 01.05.2012
Сообщений: 414
09.05.2014, 15:10     Решето Эратосфена #5
Цитата Сообщение от randy92 Посмотреть сообщение
почему мой код не работал корректно?
я написал) ты не тот остаток находил) надо было местами поменять)
Yandex
Объявления
09.05.2014, 15:10     Решето Эратосфена
Ответ Создать тему
Опции темы

Текущее время: 13:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru