Показать сообщение отдельно
  #3  
Старый 06.08.2011, 18:53
Новичок

Отправить личное сообщение для хус++ Посмотреть профиль Найти все сообщения от хус++
 
Регистрация: 09.11.2010
Сообщений: 7

переводим N в двоичную систему счисления
Код:
Bin := '';
          while (N > 0)
          do
            begin
              Bin := Chr (N mod 2 + 48) + Bin;
              N := N div 2;
            end;
добавим в двоичное представление ведущие нули
Код:
for i := 1 to (35 - Length (Bin)) do
            Bin := '0' + Bin;
теперь идем с конца двоичного представления и ищем первую единицу, слева от которой стоит ноль, после чего обменяем их местами, а все единицы, что остались справа запишем в конец числа
примерно так
Код:
 for i := Length (Bin) downto 1 do
            if (Bin [i] = '1')
               and
               (Bin [i - 1] = '0')
              then
                begin
                  Bin [i - 1] := '1';
                  Bin [i] := '0';
                  t := i;

                  break;
                end;
потом сортируем оставшуются часть числа по неубыванию
Код:
 for i := t to (Length (Bin) - 1) do
            for j := t to (Length (Bin) - i) do
              if (Bin [j] > Bin [j + 1])
                then
                  begin
                    Bin [j] := '0';
                    Bin [j + 1] := '1';
                  end;
теперь переведем результат в десятичную систему счисления и прибавляем последнюю цифру двоичного разряда
Код:
 for i := 1 to (Length (Bin) - 1) do
            if (Bin [i] <> '0')
              then
                Inc (N, Pow (2, Length (Bin) - i));
Inc (N, Ord (Bin [Length (Bin)]) - 48);