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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2010, 23:25   #11
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

rrrFer, такое решение подходит для пользователя, у которого даже нету оф.компилятора паскаля (стоит турбо, как я понимаю), и его даже реально ужать в 1 секунду)) И в самом деле, я не подумал, что можно отсеять неудобные числа до проверки на простоту)
Может быть, что чисел всего 100, так как те, у которых нету "цифр в порядке возростания", а всего одна цифра (таких 5), отброшены.
LeBron вне форума Ответить с цитированием
Старый 25.10.2010, 00:08   #12
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

да, можно ужать. Тут много времени занимает работа с потоком
кстати была ошибка, никто не заметил, вот правильнее:
Код:
#include <iostream>
#include <sstream>
using namespace std;
int main(){
	stringstream strstrm;
	char s[10];
	long int i,n,j,k;
	n=100;
	for(i=1,j=1;i<=23456789;i++){
		strstrm<<i;
		strstrm>>s;
		strstrm.clear();
		for(k=0;s[k+1];k++)
			if(s[k]>=s[k+1])
				break;
		if(!s[k+1]){
			for(k=2;k<i/2;k++)
				if(!(i%k))
					break;
			if(i%k){
				cout<<i<<" #"<<j<<endl;
				j++;
				if(j>n)
					break;
			}
		}
	}
	cout<<"end"<<endl;
	cin.get();
	return 0;
}
прикрепил исполняемый файл и файл-результат ))
Вложения
Тип файла: txt 1.txt (1,007 байт, 145 просмотров)
Тип файла: zip consol.zip (4.0 Кб, 7 просмотров)
rrrFer вне форума Ответить с цитированием
Старый 25.10.2010, 11:45   #13
pristizh
Пользователь
 
Регистрация: 22.10.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
как видно хватает массива из 10 элементов, куда вы хотите засунуть 24 миллиона элементов я даже не догадываюсь, поясните пожалуйста ))
Вот смотрите я могу найти все простые числа от 1 до N с помощью нехитрого алгоритма Эратасфена.

filchar (a,sizeof(a),1);
q:=round(sqrt(n));
for i:=2 to q do
if a[i] then
begin
j:=i*i;
while j<=n do
begin
a[j]:=false;
j:=j+i;
end;
end; програма работает быстро даже для больших чисел, я согласен с вами что переменная может принимать большие числа если она к примеру longint но в моём случае для этой програмы нужен длинный массив
a:array[1..23456789] of longint; - чего просто не может быть;
или
a:array[1..23456789] of boolean; - чего также не может быть;
Ну и что делать?
Да и чуть не забыл, спасибо за листинг программы который вы мне привели, но дело в том, что я ещё в турбо паскале не разобрался какой мне нафиг с++ так что,пожалуйсто, по возможности перевидите её, если можно на паскаль или на русском языке ,что делали хоть напишите.
pristizh вне форума Ответить с цитированием
Старый 25.10.2010, 12:28   #14
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Цитата:
дело в том, что я ещё в турбо паскале не разобрался какой мне нафиг с++
какой нафиг тебе делать на олимпиаде??? у мня только этот вопрос возник

з.ы. ппц пошли "олимпиадники"
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 25.10.2010, 13:17   #15
pristizh
Пользователь
 
Регистрация: 22.10.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от RUSt88 Посмотреть сообщение
какой нафиг тебе делать на олимпиаде??? у мня только этот вопрос возник

з.ы. ппц пошли "олимпиадники"
Я вообще не понимаю к чему вы это написали, это вам не чат , где бы я с вами спокойно мог вступить в спор, я просто не ради этого сюда захожу , я захожу чтоб на предложения посмотреть , а не чтобы вступать в полемику с теми кто помочь не может и мусор всякий пишет.
pristizh вне форума Ответить с цитированием
Старый 29.10.2010, 18:19   #16
cbuilderx
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 18
Восклицание

Привет,всем программистам этого форума.
Мне тоже приходилось отсеивать числа с пмощью Эратосфена.
Алгоритм
filchar (a,sizeof(a),1);
q:=round(sqrt(n));
for i:=2 to q do
if a[i] then
begin
j:=i*i;
while j<=n do
begin
a[j]:=false;
j:=j+i;
end;
выложен в википедии.
Я его малость подкуртил под себя.Под динамический массив и чтение из файла.Вот,вуаля,пользуйтесь.На Си был,вот паскаль.
program eratosphen;

{$APPTYPE CONSOLE}

uses
SysUtils;

type
MyArray=Array of LongBool;

var
a:MyArray;
m,n:Longword;
i,j,t:Longword;
t1,t2:Text;
begin
assign(t1,'input.txt'); reset(t1);
assign(t2,'output.txt'); rewrite(t2);

read(t1,m,n);

if n=0 then begin
if (m div m=1) and (m mod 2<>0) then write(t2,m);
end;


SetLength(a,n);

//for i:=0 to n-1 do
//a[i]:=not a[i];
//FillChar(a,sizeof(a),1);
t:=round(sqrt(n));
for i:=2 to t do
{if A[i] then} begin
j:=i*i;
while j<=n do begin
A[j]:=true;
j:=j+i;
end;
end;

for i:=m to n do
if a[i]=false then write(t2,i,' ');

close(t1);
close(t2);
halt(0);
end.

Проблема в другом,при диапозоне 2..2147483647 вылетает с ошибкой.Не считает.
Но ваше число он берет 23456789.
Для длинных чисел нужно реализовывать длинную арифметику,с которой мне возиться не хочется.
Вложения
Тип файла: rar eratosphen.rar (501 байт, 6 просмотров)
Дорога возникает только под шагами идущего...
cbuilderx вне форума Ответить с цитированием
Старый 03.11.2010, 12:00   #17
pristizh
Пользователь
 
Регистрация: 22.10.2010
Сообщений: 12
По умолчанию

Дело в том что у меня turbo Pasca 7.1 а не Delphi там нет таких модулей как uses и библиотеки SysUtils там тоже нет. Поэтому MyArray=Array of LongBool записать так нельзя, можно так MyArray:Array [1..n] of LongBool; (так как компилятор делает проверку границ массива ) в связи с этим число n относительно маленькое (1000000 уже не проходит), а мне надо чтобы оно 23456789 равнялось(вот в чём проблема)
pristizh вне форума Ответить с цитированием
Старый 03.11.2010, 12:12   #18
pray_driver
Форумчанин
 
Аватар для pray_driver
 
Регистрация: 18.08.2010
Сообщений: 140
По умолчанию

Цитата:
Сообщение от pristizh Посмотреть сообщение
простых чисел бесконечно много но нас будут интересовать только те у которых цифры идут в порядки возрастания (например 17, 2347) таких чисел всего сто
А это доказанный факт?
Люди бывают десяти типов: те, кто знают двоичную систему, и те, кто нет
pray_driver вне форума Ответить с цитированием
Старый 03.11.2010, 12:17   #19
pray_driver
Форумчанин
 
Аватар для pray_driver
 
Регистрация: 18.08.2010
Сообщений: 140
По умолчанию

pristizh, кстати, если Вам мало памяти - можно использовать файлы и динамические указатели. Технологии известны.
Код:
type
    bool_point : ^Boolean;
Люди бывают десяти типов: те, кто знают двоичную систему, и те, кто нет
pray_driver вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Простые числа. С++ mephistophel Помощь студентам 3 03.02.2011 22:12
простые числа Koko Shanel' Помощь студентам 2 08.09.2010 01:13
Простые числа Verochka Помощь студентам 14 02.12.2008 20:30
Простые числа werser Помощь студентам 8 18.06.2008 07:24