Рекурсивный подход.(Символы тоже удаляет) function grad(s:string):string; var i:byte; detect:boolean; begin while i < length(s) - 2 do begin inc(i); if (s[i] = s[i+1]) and (s[i] = s[i+2]) then {проверка последовательности из 3 елементов} begin delete(s,i,3); {если да - удаляем их} detect:=True; {логическая переменная регистрирует изменение строки} end;end; if detect = True then s:=grad(s); {если строку изменили , проверяем не появились ли там еще последовальности} grad:=s; end;
var s:string; begin readln(s); writeln(grad(s)); end.
Переводим 3 байт обоих адресов в двоичную систему счисления 152(10) = 10011000(2) 157(10) = 10011101(2)
Запишем их друг под другом
10011000 10011101
Нам нужен наибольший байт маски. В маске под единицами записывается адрес сети, под нулями - номер хоста. Адрес сети у этих адресов одинаковый, то есть для поиска наибольшего байта маски мы можем байты разделить так 10011 000 10011 101
Первые пять разрядов - это окончание адреса сети, последние три - начало хоста. Хосту в маске подсети соответствуют нули, адресу сети - единицы, получается, что наибольший байт маски равен
function grad(s:string):string;
var
i:byte;
detect:boolean;
begin
while i < length(s) - 2 do
begin
inc(i);
if (s[i] = s[i+1]) and (s[i] = s[i+2]) then {проверка последовательности из 3 елементов}
begin
delete(s,i,3); {если да - удаляем их}
detect:=True; {логическая переменная регистрирует изменение строки}
end;end;
if detect = True then
s:=grad(s); {если строку изменили , проверяем не появились ли там еще последовальности}
grad:=s;
end;
var
s:string;
begin
readln(s);
writeln(grad(s));
end.