Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сравнение двоичных чисел


Страницы:   1 2

Delphman ©   (2005-10-13 22:04:00) 

Допустим есть число (двоичное) заданное строкой типа string s='10001111'
Как автоматизировать следующий процесс:
Эта строка делится пополам и сравнивается:
1000<=1111
затем делится так (от цендра или концов не важно):
   00<=11
10    <=   11
затем так:
1      <=      1
 0    <=    1
   0  <=  1
     0<=1

Длина строки равна 2^n, n=2,3,4...26

Можно ли такое сделать? Чё то в голову ничего не приходит.


Fenik   (2005-10-19 18:12:00) [1]

usesMath;

functionMonoFunc( constBinStr: string): Boolean;
varI, J, L, N, Left, Right: Integer;
begin
 Result := False;
 L := Length(BinStr);
  ifL > 1 then begin
    ifFrac(Log2(L)) <> 0 then
     Exit; { Длина строки не является степенью двойки, поэтому выходим. }

   N := L div2; { длина сравниваемых подстрок }
    repeat
     Left := 0;      { позиция начала текущей левой подстроки в BinStr }
     Right := L - N; { позиция начала текущей правой подстроки в BinStr }
      forI := 1 toL div(N+N) do begin
        forJ := 0 toN - 1 do begin
          ifPChar(BinStr)[Left + J]  = '1' then begin
            ifPChar(BinStr)[Right + J] = '0' then
             Exit;  { Условие нарушено. Выходим с отрицательным результатом. }
          end
          else
            ifPChar(BinStr)[Right + J] = '1' then
             Break; { Дальше проверять не стоит: ясно, что правое число больше левого. }
        end;
       Inc(Left, N);
       Dec(Right, N);
      end;
     N := N div2;
    untilN < 1;
   Result := True;
  end;
end;


Fenik   (2005-10-19 02:24:00) [2]

Блин, точно. Теперь вьехал :)
Завтра доделаю.


Delphman   (2005-10-18 11:20:00) [3]

Всё бы хорошо, но 1001 выдаёт +, а должен - т.к.
10<=01 result='-'


Delphman   (2005-10-17 18:59:00) [4]

Fenik спасибо, так кароче чем у меня, но я ещё не проверял.


Fenik   (2005-10-16 18:15:00) [5]

> Delphman  (15.10.05 18:49) [19]

Или важно место, где возникает "-", а не то, возникает он вообще или нет?


Fenik   (2005-10-16 17:30:00) [6]

Может я чего-то не понял, но по твоим примерам сделал вот это:

functionMonoFunc( constBinStr: string): Boolean;
varI, L: Integer;
begin
 Result := True;
 L := Length(BinStr);
  ifL mod2 = 0 then
  forI := 0 toL div2 - 1 do
    if(PChar(BinStr)[I]       = '1') and
      (PChar(BinStr)[L-(I+1)] = '0') then
    begin
     Result := False;
     Break;
    end;
end;

procedureTForm1.Button1Click(Sender: TObject);
begin
  ifMonoFunc(Edit1.Text) then
   Caption := '+'
  else
   Caption := '-';
end;


Delphman   (2005-10-16 10:54:00) [7]

так вычисляется количество повторений


Fenik   (2005-10-15 20:03:00) [8]

> x:=exp(ln(2) * i);

Это что?


Delphman   (2005-10-15 18:49:00) [9]

Во посмотрите правильно ли сдела? Может чтонибудь можно сделать для
оптимизации кода, с учётом того что длина строки может быть 2^26

procedure TForm1.Button1Click(Sender: TObject);
const
s='1234567887654321'; //test1 n=16
//s='12344321';         //test2 n=8
//s='1221';             //test3 n=4
//s='12';             //test4 n=2
var
i,j,cols: integer;
x: real;
op1,op2,r: string;
begin
i:=0;x:=1;
memo1.Lines.add(s);
repeat
x:=exp(ln(2) * i);
cols:=(length(s) div 2) div trunc(x);
for j:=1 to trunc(x) do begin
op1:=copy(s,j*cols-cols+1,cols);
op2:=copy(s,length(s)-(j*cols-1),cols);
if strtoint(op1)<=strtoint(op2) then
r:='+' else r:='-';
memo1.Lines.add(floattostr(x)+' op1='+op1+' op2='+op2+' r= '+r);
end;
inc(i);
until x=length(s) div 2;
end;


Delphman   (2005-10-15 17:55:00) [10]

Во кое чё получилось, но бажет непойму где (хотя я вижу где, но не знаю как
исправить).

procedure TForm1.Button1Click(Sender: TObject);
const
s='1001110010011100';
var
i,j: integer;
x: real;
op1,op2: string;
begin
i:=0;x:=1;
memo1.Lines.add(s);
repeat
x:=exp(ln(2) * i);
for j:=1 to trunc(x) do begin
op1:=copy(s,j,(length(s) div 2) div trunc(x));
op2:=copy(s,(length(s) div 2)+j,(length(s) div 2) div trunc(x));
memo1.Lines.add(floattostr(x)+' op1='+op1+' op2='+op2);
end;
inc(i);
until x=length(s) div 2;
end;


Delphman   (2005-10-15 13:06:00) [11]

<= вот это условие если выполняется, то дальше делим и сравниваем, если нет result='-' и выходим


Delphman   (2005-10-15 12:56:00) [12]

>> Да, чему теперь в институтах учат! Ничего не понятно.
Да, еслиб это было в институте, а то в технаре, а в институте вообще ничему не учат покрайне мере в моём.

>>Какое условие?
во пример есть при длине строки 2^2:
0110
01<=10 result='+'
0  <=  0 result='+'
 1<=1 result='+'

1110
11<=10 result='-' exit

1010
10<=10 result='+'
1<=0 result='-' exit


palva   (2005-10-14 23:57:00) [13]

Да, чему теперь в институтах учат! Ничего не понятно.
Самое образованное поколение!


Fay   (2005-10-14 22:04:00) [14]

2 Delphman   (14.10.05 17:08) [12]

>> Строка делится пополам, сравнивается; эти строки
>> делются тоже пополам, сравниваются и так далее.
Что "и так далее" ?

>> Если условие верно
Какое условие?


Delphman   (2005-10-14 21:59:00) [15]

В теории это выглятит так:
http://dvo.sut.ru/libr/himath/w163rabk/7.htm
см. класс монотонных функций, может легче можно сделать, чем я тут писал.


Delphman   (2005-10-14 17:08:00) [16]

Переводить числа в десятичные я и сам умею, мне их нужно сравнивать именно так. Строка делится пополам, сравнивается; эти строки делются тоже пополам, сравниваются, и так далее.
Если условие верно то
Result:='+' else begin Result:='-'; exit; end;


Anatoly Podgoretsky   (2005-10-14 16:46:00) [17]

Меня суть не интересовала, не готов решать задания в форумах. Да и суть не важно, надо не думать, а трясти.


Fay   (2005-10-14 16:43:00) [18]

2 Anatoly Podgoretsky ©   (14.10.05 16:12) [9]
Анатолий, Вы понимаете суть задания?


Anatoly Podgoretsky   (2005-10-14 16:12:00) [19]

Не требуется самый быстрый, требуется решение именно по институтскому заданию.


Fay   (2005-10-14 11:29:00) [20]

2 Игорь Шевченко ©   (14.10.05 11:07) [6]
... И это самый быстрый способ из уже предложенный...
8)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо