![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сравнение двоичных чисел
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)