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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2008, 15:27   #1
xxxPascalxxx
Life:[### ]22%
Пользователь
 
Аватар для xxxPascalxxx
 
Регистрация: 15.12.2007
Сообщений: 48
Лампочка Множество

Здравствуйте. Если можете, помогите придумать алгоритм заполнения множества. Суть такая: нужно в файл записать множество содержащее 500 элементов при том, что если в числе содержится цифра из предыдущего числа, то оно не пишется, записывается только если в предыдущем числе нет цифр из числа последующего, т.е.
0-1-2-3-4-5-6-7-8-9-10-22-30-41-50-61-70-81-90-111-200-... и тд.
Я думал над прибовлением по единици, сравнении с предыдущем и занесении в массив состоящий из 500 элементов, но мне не придумать условие сравнения.
Написать надо в Delphi 7
Если кто может помочь, буду очень признателен.
My Life v1.0b ERROR: health.dll not found
xxxPascalxxx вне форума Ответить с цитированием
Старый 23.02.2008, 16:12   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Код:
S1 := IntToStr(N1); предыдущее
S2 := IntToStr(N2); следующее

isInclude := true;
for i:=1 to length(S2) do begin
   for j:=1 tp length(S1) do begin
      if S1[j] = S2[i] then begin
         isInclude := false;
         break;
      end;
   end;
end;  

if isInclude then begin
   ...
alexBlack вне форума Ответить с цитированием
Старый 23.02.2008, 16:41   #3
xxxPascalxxx
Life:[### ]22%
Пользователь
 
Аватар для xxxPascalxxx
 
Регистрация: 15.12.2007
Сообщений: 48
По умолчанию

Большое спасибо!
My Life v1.0b ERROR: health.dll not found
xxxPascalxxx вне форума Ответить с цитированием
Старый 23.02.2008, 18:18   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

to xxxPascalxxx
А вы уверены, что вам нужно 500 членов множества и что предложенный вам алгоритм будет работать? По крайней мере у меня 60 - ый член множества, который равен 9111111, вычислялся почти две минуты.
puporev вне форума Ответить с цитированием
Старый 23.02.2008, 20:16   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

м..да

я то-же попробовал. Очень медленно. И похоже диапазон integer исчерпается раньше 500-го элемента.

Но есть и хорошая новость. Наблюдается устойчивая закономерность:

200
311
400
511
600
711
800
911
2000
3111
4000
5111

можно отталкиваться от этого.
alexBlack вне форума Ответить с цитированием
Старый 23.02.2008, 20:28   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Собственно вот код в консоли Делфи. Но до 500 я так и не добрался, даже не знаю чем кончится.
Код:
program chislo1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type Mn=set of 0..9;
var a,R:longWord;n,i,j:integer;
    f1,f2:text;
procedure Mnog(a:longWord;var b:Mn);//разложение числа на цифры
var k:integer;
begin
b:=[];
  while a>0 do
     begin
        k:=a mod 10;
        include(b,k);//создание из них множества
        a:=a div 10;
     end;
end;
function Ner(a1,a2:longWord):boolean;//сравнение чисел
var b1,b2:Mn;
begin
Ner:=true;  //нет общих цифр
Mnog(a1,b1);
Mnog(a2,b2);
if b1*b2<>[] then Ner:=false;//если есть общие цифры
end;
begin
   assign(f1,'numseq.in');
   rewrite(f1);
   assign(f2,'numseq.out');
   rewrite(f2);
   write('n=');readln(n);
   write(f1,n);
   for j:=1 to n do
     begin
        a:=0;R:=0;i:=2;
        while i<=j do
           begin
             a:=a+1;
             if Ner(a,R) then
                begin
                   R:=a;
                   i:=i+1;
                end;
           end;
        writeln('R=',R);
        write(f2,R,' ');
       end;
readln;
close(f1);
close(f2);
end.
puporev вне форума Ответить с цитированием
Старый 23.02.2008, 20:53   #7
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

уже просто из любопытства.

200 - 21-й элемент

каждые 8 элементов добавляется новый разряд. значит 500-й элемент будет ~ 60 разрядов. Т.е. прямым перебором с проверкой условия расчет никогда не закончится.
alexBlack вне форума Ответить с цитированием
Старый 24.02.2008, 02:35   #8
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Как правильно заметили, появляется закономерность...
Начинается она с числа 200 ( 21 элемент )..

Сообственно эту закономерность и используем..

Код:
{$APPTYPE CONSOLE}

uses
  SysUtils;

var d_ch_0, d_ch_1 : String;
    i, n, z : integer;
    mas : array [1..500] of string;
    f : Text;

Begin

d_ch_0 := '00'; d_ch_1 := '11'; z := 2;

Writeln ('Go?'); Write ('n=');
Readln (n);

Assign(f,'Out.txt');
Rewrite(f);

For i := 21 To n Do
  Begin
    if (i mod 2 = 1) Then
      mas[i] := IntToStr(z) + d_ch_0;
    if i mod 2 = 0 Then
      mas[i] := IntToStr(z) + d_ch_1;
    Writeln(f, '#', i,'   ', mas[i]);
    z := z + 1;
    if z = 9 Then
      Begin
        z := 2;
        d_ch_0 := d_ch_0 + '0';
        d_ch_1 := d_ch_1 + '1';
      End;
  End;

Close(f);
Writeln('Massiv zapolnen!');
Writeln('Save, Jmi <Enter>');
Readln;

end.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 24.02.2008, 09:50   #9
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Идея со строками хорошая, только алгоритм надо подправить, а то 28-й элемент = 911, а у вас он выпадает. Вместо него 2111, хотя 29 = 2000.
puporev вне форума Ответить с цитированием
Старый 24.02.2008, 10:37   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Вот так всегда, только более-менее интересная задачка, так сразу Дельфи.

В общем, алгоритм простой и суть его не в том, чтобы складывать числа, а в том, чтобы складывать цифры, а вовсе не искать закономерности, которых, строго говоря, нет. Одним словом, если кому интересно, могу предложить реализацию на ЦПП c несколько упрощенной и не ахти какой оптимальной арифметикой больших чисел. 500 элементов данный алгоритм получает за 1-2 секунды, несколько дольше ~1700 элементов, после чего разрядность чисел превышает 256.

перебор выглядит вот так:

Код:
bignumber Set[POWER_OF_SET];

int main()
{
	long i;
	unsigned char j;
	bignumber tmp;

	srand((unsigned int)time(0));
	Set[0] = rand() % 256;
	for(i = 1; i < POWER_OF_SET; i++){
		tmp = Set[i - 1];
		while((tmp.EnumDigits() & Set[i - 1].EnumDigits() )) {
			for(j = 0; j < tmp.DigitCount() - 1; j++) {
				tmp.IncrementByDigit(j);
				if(! (tmp.EnumDigits() & Set[i - 1].EnumDigits() )) break;
			}
		}
		cout << i << " : " << tmp << endl;
		Set[i] = tmp;	
	}
	
	return 0;
}
класс bignumber объявлен вот так: (большая часть операторов даже не понадобилась)

Код:
class bignumber{
	friend ostream &operator<<(ostream&, const bignumber&);
	public:
		bignumber();
		~bignumber();
		const bignumber &operator=(const bignumber&);
		const bignumber &operator=(const unsigned long);
		const bignumber &operator+(const bignumber&);
		const bignumber &operator+(const unsigned long);
		const bignumber &operator+=(const bignumber&);
		const bignumber &operator+=(const unsigned long);
		const bignumber &operator++();
		bool operator==(const bignumber&);
		bool operator!=(const bignumber&);
		bool operator<(const bignumber&);
		bool operator>(const bignumber&);
		void IncrementByDigit(unsigned char);
		unsigned long EnumDigits();
		unsigned char DigitCount();
	private:
		unsigned char cDigitCount;
		unsigned char *number;

};
Исходник и экзешник в архиве.
Вложения
Тип файла: rar set.rar (44.1 Кб, 13 просмотров)
B_N вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi. Множество Мандельброта и Жюлиа KEnt Помощь студентам 8 07.12.2011 23:54
Как задать множество 1234 Паскаль, Turbo Pascal, PascalABC.NET 7 25.05.2008 16:15
Множество браузеров LeoN Общие вопросы Delphi 0 01.05.2008 14:55
Что такое множество? ZhekON Помощь студентам 3 07.04.2008 20:22