{ арифметические алгоритмы: моделирование вычитания двоичных чисел }
{ ------------------------------------------------------------------------ }
var sr, sf, ss: string;
{ вычитание двоичных строк, первое число должно быть >= второго }
function BinSub(s1, s2: string): string;
var s : string;
l, i, j: byte;
begin
{ выравнивание строк по длине }
if length(s1) > length(s2) then while length(s2) < length(s1) do s2 := '0' + s2
else while length(s1) < length(s2) do s1 := '0' + s1;
l := length(s1); { начало алгоритма вычитания }
s := '';
for i := l downto 1 do begin
case s1[i] of
'1': if s2[i] = '0' then s := '1' + s else s := '0' +s;
'0': if s2[i] = '0' then s := '0' + s else begin
s := '1' + s;
if (s1[i-1] = '1') then s1[i-1] := '0' else begin
j := 1;
while (i-j > 0) and (s1[i-j] = '0') do begin
s1[i-j] := '1';
inc(j);
end;
s1[i-j] := '0';
end;
end;
end;
end;
{ Уничтожение нулей слева }
while (length(s) > 1) and (s[1] = '0') do delete(s, 1, 1);
BinSub := s;
end;
begin
writeln('Введите 1-е двоичное число:');
readln(sf);
writeln('Введите 2-е двоичное число:');
readln(ss);
sr := BinSub(sf, ss);
writeln('Результат вычитания = ', sr);
end.