Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2011, 18:20   #1
Silly Student
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 32
По умолчанию [C++] Решето эратосфена, где баг ?

Требуется реализовать Решето Эратосфена

Но почемуто вычеркнуть получается только первый элемент (цифра "4").

Делаю так:

Код:
//---------------------------------------------------------------------------
#include <iostream.h>
#pragma hdrstop

#include <tchar.h>
//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
const int n = 20; //до куда выписываем целые числа
int array[n]={NULL};//массив, заполненный нулями
int p = 2; // первое простое число

//заполняю массив целыми числами от 2 до n

for (int i = 2; i <= n; i++) {
	array[i] = i;
}

//вычеркиваю из списка все числа от 2p до n, делящиеся на p
for (int i = p*2; p <= n;) {
	if (array[i]%p == 0) {
	array[i]=0;
	}
	if (array[i] > p) {
		p=array[i];
	}
		i++;
}
//вывод результата. (всё, что не 0, то простое)
for (int i = 0; i <= n; i++) {
	cout << array[i] << endl;
}
system("PAUSE");
	return 0;
}
//---------------------------------------------------------------------------
Глядя на статью в википедии, мне начинает казаться, что тут нужно вставить еще 1 цикл, но где, и какой ?
Silly Student вне форума Ответить с цитированием
Старый 19.04.2011, 19:10   #2
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Ну я бы сделал так:
Код:
#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    //Алгоритм с википедии
    std::vector<unsigned int> simples;
    unsigned int n = 120;
    //1. Выписать подряд все целые числа от двух до n (2, 3, 4, …, n).
    for (unsigned int i = 2; i <= n; i++)
        simples.insert(simples.end(), i);

    for (std::vector<unsigned int>::iterator i = simples.begin(); i != simples.end(); i++)
    {
        //2. Пусть переменная p изначально равна двум — первому простому числу.
        //Далее будет:
        //4. Найти первое не вычеркнутое число, большее чем p, и присвоить значению переменной p это число.
        int p = *i;
        //3. Вычеркнуть из списка все числа от 2p до n, делящиеся на p (то есть, числа 2p, 3p, 4p, …)
        for (unsigned int j = 2*p; j <= n; j += p)//Каждый шаг прибавляем по p, начиная от 2p. Получается 2p, 3p, etc.
        {
            //Ищем элемент
            std::vector<unsigned int>::iterator item = std::find(simples.begin(), simples.end(), j);
            //Если его нет, то пропускаем
            if (item == simples.end()) continue;
            //Иначе удаляем
            if (j%p == 0)
                simples.erase(item);
        }
        std::cout<<p<<std::endl;
        //5. Повторять шаги 3 и 4 до тех пор, пока p не станет больше, чем n
    }

    //6. Все не вычеркнутые числа в списке — простые числа.
    return 0;
}
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 20.04.2011, 12:29   #3
Silly Student
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 32
По умолчанию

Чёто сложно. Векторы, итераторы, какието ::
Silly Student вне форума Ответить с цитированием
Старый 20.04.2011, 13:06   #4
Silly Student
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 32
По умолчанию

Ввёл функцию, и всё заработало ) Они всётаки облегчают жизнь.


Код:
//---------------------------------------------------------------------------

#pragma hdrstop
#include <iostream.h>
#include <tchar.h>
//---------------------------------------------------------------------------

#pragma argsused
int func(int); // прототип

int _tmain(int argc, _TCHAR* argv[])
{
int x = 100; //до какого числа надо получить простые

for (int i = 2; i <= x; i++) {
	func(i);
}

system("PAUSE");
	return 0;
}

int func(int n)
{
	//int n=7;
bool prostoe = false;
for (int i = 2; i < n; i++) {
	if (n%i!=0) {
		prostoe=true;
	}
	else {
		prostoe = false;
		break;
	}
}

//
if (prostoe==true) {
	cout << n << "  (prostoe) " << endl;
}
return 0;
}
//---------------------------------------------------------------------------
Silly Student вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Timus 1205 - думаю уже неделю где баг >=VeNoM=< Помощь студентам 0 24.12.2010 19:55
Решето Эратосфена cbuilderx Помощь студентам 1 25.10.2010 18:44
Баг в BDS2006 posdnyaa Софт 1 19.12.2007 12:31