#include <deque>
#include <iostream>
#include <math.h>
using namespace std;
#define MAX_VAL 1000000
// Алгоритм: начинаем с числа 2. Выводим текущее число, "вычеркиваем" числа, кратные текущему, ищем следующее невычеркнутое число.
void main (void)
{
int min_val, max_val;
cout << "Enter left limit: ";
cin >> min_val;
cout << "Enter right limit: ";
cin >> max_val;
if (max_val > MAX_VAL || min_val < 2 || max_val < min_val)
{
cout << "Wrong limits";
return;
};
// Поиск простых ведем до корня из max_val
int sqrt_max_val = (int)sqrt((double)max_val);
// Признаки "вычеркнутости" чисел (элементы 0 и 1 не используются)
deque<bool> flags (max_val+1, false); // первоначально все числа не перечеркнуты
int current_value (2);
do
{
if (current_value >= min_val)
cout << current_value << endl;
// Вычеркиваем все числа, кратные current_value, начиная с его квадрата
for (int i = current_value * current_value; i <= max_val; i += current_value)
flags = true;
// Ищем следующее невычеркнутое число
for (++current_value; current_value <= sqrt_max_val && flags[current_value]; ++current_value) ;
} while (current_value <= sqrt_max_val);
// Выведем все невычеркнутые числа больше корня из N, при этом не рассматриваем числа менее min_val
for (current_value = min_val > sqrt_max_val+1 ? min_val : sqrt_max_val+1; current_value <= max_val; ++current_value)
if (!flags[current_value])
cout << current_value << endl;
};
[C++] Нахождение простых чисел.
Ограничения: 2 <= M <= N <= 1 000 000, время 6 с.
(еод нужен на с++)
Благодарю за ранее
[COLOR=Red]Читай правила форума. За неправильное название темы -5. В следущий раз можно и в бан попасть. OlgaKr.[/COLOR]
нетни у кого решения по проше ведь на паскале решено просто
надо было немного погуглить и все. вот тебе ссылочка http://alglib.sources.ru/numbers/erat.php у меня предложенный на дельфи код отрабатывает за 2 с лишком секунды, при среднем по мощности компе.
оффтоп
[quote=Dolonet]У меня есть такая программа, давно еще делал. Выводит и в файл, и на экран. За сколько купишь?[/quote]
голодаешь? кушать нечего? совет тебе: не хочешь помогать, относишься пренебрежительно к тем кто просит помощи в Студентам и т.п.: не отвечай и не флуди, а то как то на модератора неочень похож получаешься.
Вот мой вариант:
Код:
Код работает долго, но только за счет вывода на экран. Без вывода все числа от 2 до миллиона генерируются менее, чем за полсекунды (Пентиум 4 - 2,4 ГГц).
Код:
#include <stdio.h>
#include <memory.h>
#include <math.h>
#pragma warning (disable: 4996)
// Для визуал-студии. Она ругается на memset
#define MAX_VAL 1000000
// Алгоритм: начинаем с числа 2. Выводим текущее число, "вычеркиваем" числа, кратные текущему, ищем следующее невычеркнутое число.
void main (void)
{
int min_val, max_val;
printf ("Enter left limit: ");
scanf ("%i", &min_val);
printf ("Enter right limit: ");
scanf ("%i", &max_val);
if (max_val > MAX_VAL || min_val < 2 || max_val < min_val)
{
printf ("Wrong limits");
return;
};
// Поиск простых ведем до корня из max_val
int sqrt_max_val = (int)sqrt((double)max_val);
// Признаки "вычеркнутости" чисел (элементы 0 и 1 не используются)
char *flags = 0;
try
{
flags = new char [max_val+1];
// первоначально все числа не перечеркнуты
memset (flags, 0, max_val+1);
int current_value (2);
do
{
if (current_value >= min_val)
printf ("%i\n", current_value);
// Вычеркиваем все числа, кратные current_value, начиная с его квадрата
for (int i = current_value * current_value; i <= max_val; i += current_value)
flags = true;
// Ищем следующее невычеркнутое число
for (++current_value; current_value <= sqrt_max_val && flags[current_value]; ++current_value) ;
} while (current_value <= sqrt_max_val);
// Выведем все невычеркнутые числа больше корня из N, при этом не рассматриваем числа менее min_val
for (current_value = min_val > sqrt_max_val+1 ? min_val : sqrt_max_val+1; current_value <= max_val; ++current_value)
if (!flags[current_value])
printf ("%i\n", current_value);
}
catch(...)
{
if (flags != 0)
delete[] flags;
};
};
#include <memory.h>
#include <math.h>
#pragma warning (disable: 4996)
// Для визуал-студии. Она ругается на memset
#define MAX_VAL 1000000
// Алгоритм: начинаем с числа 2. Выводим текущее число, "вычеркиваем" числа, кратные текущему, ищем следующее невычеркнутое число.
void main (void)
{
int min_val, max_val;
printf ("Enter left limit: ");
scanf ("%i", &min_val);
printf ("Enter right limit: ");
scanf ("%i", &max_val);
if (max_val > MAX_VAL || min_val < 2 || max_val < min_val)
{
printf ("Wrong limits");
return;
};
// Поиск простых ведем до корня из max_val
int sqrt_max_val = (int)sqrt((double)max_val);
// Признаки "вычеркнутости" чисел (элементы 0 и 1 не используются)
char *flags = 0;
try
{
flags = new char [max_val+1];
// первоначально все числа не перечеркнуты
memset (flags, 0, max_val+1);
int current_value (2);
do
{
if (current_value >= min_val)
printf ("%i\n", current_value);
// Вычеркиваем все числа, кратные current_value, начиная с его квадрата
for (int i = current_value * current_value; i <= max_val; i += current_value)
flags = true;
// Ищем следующее невычеркнутое число
for (++current_value; current_value <= sqrt_max_val && flags[current_value]; ++current_value) ;
} while (current_value <= sqrt_max_val);
// Выведем все невычеркнутые числа больше корня из N, при этом не рассматриваем числа менее min_val
for (current_value = min_val > sqrt_max_val+1 ? min_val : sqrt_max_val+1; current_value <= max_val; ++current_value)
if (!flags[current_value])
printf ("%i\n", current_value);
}
catch(...)
{
if (flags != 0)
delete[] flags;
};
};
Второй вариант - есть пара проблем с языковой точки зрения: здесь перемешаны С и С++. Это касается printf/scanf и char* вместо deque (это С), и try/catch (это С++).try/catch нужен для гарантированного уничтожения char *flags.
Поиск простых от 2 до 1 000 000 происходит за 3,4 сек. с выводом на экран, и за 0,172 сек., если перенаправить вывод в файл.
Источник:
И. М. Виноградов. Основы теории чисел. Учебное пособие, 2006 г. Стр. 14.
Спасибо большое
А где выводится
Цитата: Prince Firdavs
Вывести все простые числа от M до N включительно.
Ограничения: 2 <= M <= N <= 1 000 000, время 6 с.
(еод нужен на с++)
Благодарю за ранее
[COLOR=Red]Читай правила форума. За неправильное название темы -5. В следущий раз можно и в бан попасть. OlgaKr.[/COLOR]
Ограничения: 2 <= M <= N <= 1 000 000, время 6 с.
(еод нужен на с++)
Благодарю за ранее
[COLOR=Red]Читай правила форума. За неправильное название темы -5. В следущий раз можно и в бан попасть. OlgaKr.[/COLOR]
Посмотри вот этот код еще. Может это то, что тебе нужно...
Код:
#include<cstdio>
#include<cmath>
using namespace std;
#define UPPERBOARD 1000
int mas[168], size = 0;
bool flag;
void makePrecalc()
{
for( int i = 2; i <= UPPERBOARD; ++i)
{
flag = 1;
for( int j = 2; j <= sqrt((double)i); ++j)
if( !(i % j) )
{
flag = 0;
break;
}
if( flag )
mas[ size++ ] = i;
}
}
void generate(int m, int n)
{
makePrecalc();
bool isPrimeIntegers = 0;
for( int i = m; i <= n ;++i )
{
flag = 1;
for( int j = 0; j < size && mas[ j ] <= sqrt((double) i ); ++j)
if( !(i % mas[ j ]) )
{
flag = 0;
break;
}
if( flag )
{
isPrimeIntegers = 1;
printf("%d\n", i);
}
}
if( !isPrimeIntegers )
printf("Absent");
}
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt","w", stdout);
int m, n;
scanf("%d%d", &m, &n);
generate(m, n);
return 0;
}
#include<cmath>
using namespace std;
#define UPPERBOARD 1000
int mas[168], size = 0;
bool flag;
void makePrecalc()
{
for( int i = 2; i <= UPPERBOARD; ++i)
{
flag = 1;
for( int j = 2; j <= sqrt((double)i); ++j)
if( !(i % j) )
{
flag = 0;
break;
}
if( flag )
mas[ size++ ] = i;
}
}
void generate(int m, int n)
{
makePrecalc();
bool isPrimeIntegers = 0;
for( int i = m; i <= n ;++i )
{
flag = 1;
for( int j = 0; j < size && mas[ j ] <= sqrt((double) i ); ++j)
if( !(i % mas[ j ]) )
{
flag = 0;
break;
}
if( flag )
{
isPrimeIntegers = 1;
printf("%d\n", i);
}
}
if( !isPrimeIntegers )
printf("Absent");
}
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt","w", stdout);
int m, n;
scanf("%d%d", &m, &n);
generate(m, n);
return 0;
}
Цитата: Prince Firdavs
А где выводится
Фирдаус, по моим подсчетам, примерно 29-я строка. Привожу собственно код, который выводит:
Код:
if (current_value >= min_val)
cout << current_value << endl;
cout << current_value << endl;
Короче, алгоритм такой. Пользователь может потребовать, чтобы я вывел ему числа, скажем, от 100 000 до миллиона, но я все равно подсчитываю числа от 2 до миллиона. Просто не вывожу числа, меньшие 100 000. В данном случае - 100 000 - это min_val.
Код:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
unsigned long count=0;
char ss[256];
unsigned long *m = (unsigned long*)new char[500000*sizeof(unsigned long)];
memset((void*)m, 0, 500000*sizeof(unsigned long));
MessageBox(NULL, "Начать", "Program", 0);
for(unsigned long i=3; i<1000000; i+=2){
double sq = sqrt(i);
for(unsigned long ii=0;ii<500000; ii++)
if(m[ii] > sq || !m[ii]) {m[count++] = i; break;}
else if(!(i%m[ii]))break;
}
MessageBox(NULL, "Закончил", "Program", 0);
ofstream logOut;
logOut.open("prime.txt",ios::binary);
if(!logOut.bad())
for(unsigned long ii=0;ii<count; ii++)
{
sprintf(ss, "%u\r\n", m[ii]);
logOut.write(ss, strlen(ss));
}
logOut.close();
delete m;
return 0;
}
{
unsigned long count=0;
char ss[256];
unsigned long *m = (unsigned long*)new char[500000*sizeof(unsigned long)];
memset((void*)m, 0, 500000*sizeof(unsigned long));
MessageBox(NULL, "Начать", "Program", 0);
for(unsigned long i=3; i<1000000; i+=2){
double sq = sqrt(i);
for(unsigned long ii=0;ii<500000; ii++)
if(m[ii] > sq || !m[ii]) {m[count++] = i; break;}
else if(!(i%m[ii]))break;
}
MessageBox(NULL, "Закончил", "Program", 0);
ofstream logOut;
logOut.open("prime.txt",ios::binary);
if(!logOut.bad())
for(unsigned long ii=0;ii<count; ii++)
{
sprintf(ss, "%u\r\n", m[ii]);
logOut.write(ss, strlen(ss));
}
logOut.close();
delete m;
return 0;
}
Тему закрываю,поскольку уже не первый раз в ней возникают не нужные разговоры.