Шестнадцать участников проекта прислали свои
программы, в 10 присланных работах имелось описание алгоритма. Далее привожу
авторское решение задачи.
Найдем
двоичное разложение заданного числа. Просматривая его слева направо, пропускаем
нули, первую единицу заменяем нулем, также далее следующую группу единиц заменяем
нулями, подсчитывая количество таких замен, первый встретившийся ноль заменяем на единицу, справа дописываем подсчитанное
количество единиц. Особо следует рассмотреть правую границу указанного
диапазона значений, так как следующее для неё значение равно 231,
что выходит за границы диапазона longint.
Программа
var
n :longint;
i, k, j : integer;
a : array [1..32] of integer;
begin
assign(input,'input.txt'); reset(input);
assign(output,'output.txt'); rewrite(output);
read(n); k:=0;
while n>0 do
begin k:=k+1; a[k]:=n mod 2; n:=n div 2 end;
i:=1; while a[i]=0 do i:=i+1;
a[i]:=0; i:=i+1;
j:=0;
while a[i]=1 do begin a[i]:=0; i:=i+1; j:=j+1 end;