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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2010, 12:52   #1
adokS
 
Регистрация: 31.10.2010
Сообщений: 4
Восклицание Оптимизация поиска простых чисел

Требуется найти все простые числа от 2 до 1 000 000.
Задача задача сама по себе не сложная, но выполняется почему-то очень долго (секунд 25), везде написано, что таким методом должна выполняться намного быстрее. Метод следующий: делим проверяемое число X на найденные на предыдущих щагах и записанные в массив A[] простые числа, которые меньше корня из X. Корень каждый раз заново не находим, а получаем из предыдушего значения, прибавляя 1, когда нужно. Зная корень из X, ищем индекс в массиве A[], до которого проверяем делимость числа X.
Видимо, я где-то налажал с реализацией, найти не могу .
Код следующий:
Код:
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
void primes()
{
	int A[168]; //корень из 1 000 0000 это 1000, в 1000 168 простых 
//чисел
	int root=1,root_i=0,k=0,f; //root-корень, root_i - индекс в массиве 
//A[] текущего корня, k-индекс для записи протых чисел в A[]
	int I=1; // количество простых чисел
	A[0]=2; // заносим первое простое число - 2
		cout<<"2 ";
	for(int i=3;i<1000000;i++) // поехали
	{
		f=1; // флаг, 1-число простое, 0-нет
		if((root+1)*(root+1)==i) //проверяем, нужно ли 
//увеличить корень
			root++;
		if(root>A[root_i] & root>=A[root_i+1])  //проверяем, 
//нужно ли увеличить индекс, докоторого перебираем
			root_i++;
		for(int j=0;j<=root_i;j++)
			if(i%A[j]==0) // если делится без остатка,
// число не простое
			{f=0; break;}
			if(f==1) // если предыдущее условие не выполнилось, значит число простое
			{
				if(i<1000) // проверка, нужно ли 
//заносить данное число (I) в массив простых чисел
					A[++k]=i;
                                             cout<<i<<" ";
				I++;

			}
		

	}
	cout<<"I="<<I;
}
adokS вне форума Ответить с цитированием
Старый 06.11.2010, 15:51   #2
adokS
 
Регистрация: 31.10.2010
Сообщений: 4
По умолчанию

Все, вопрос решен. Оказалось, что так долго работало из-за cout<<, надо было pfintf() использовать, а еще быстрее(при чем на много) - fprintf()... Блин, я и не знал даже.
adokS вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Первые 30 простых чисел Fantom.as Общие вопросы C/C++ 11 19.04.2015 09:10
Поиск простых чисел из диапазона dex92 Помощь студентам 2 21.05.2010 09:40
Нахождение простых чисел. Lunex.08 Общие вопросы C/C++ 7 10.04.2009 17:01
Вывод простых чисел. MAKEDON Помощь студентам 1 10.03.2009 16:55
Оптимизация поиска mutabor Общие вопросы Delphi 14 07.02.2008 14:30