Домашние задания: Информатика

Объясните более подробно, почему не 6, а 7 . Откуда +1 взялось.

Задание 6 № 17324
Автомат обрабатывает натуральное число N по следующему алгоритму:

1. Строится двоичная запись числа N.

2. Удаляется первая слева единица и все следующие непосредственно за ней нули. Если после этого в числе не остаётся цифр, результат этого действия считается равным нулю.

3. Полученное число переводится в десятичную запись.

4. Новое число вычитается из исходного, полученная разность выводится на экран.

Пример. Дано число N = 11. Алгоритм работает следующим образом.

1. Двоичная запись числа N: 1011.

2. Удаляется первая единица и следующий за ней ноль: 11.

3. Десятичное значение полученного числа 3.

4. На экран выводится число 11 – 3 = 8.
Сколько разных значений будет показано на экране автомата при последовательном вводе всех натуральных чисел от 10 до 1000?
Экспериментально с помощью программы получено 7. Не 6 из-за чисел от 10 до 15, действительно, т. к. от 8 до 16 будет выводиться 8.

Результат выполнения программы:

8: 10 - 2 [1,0]
16: 16 - 0 []
32: 32 - 0 []
64: 64 - 0 []
128: 128 - 0 []
256: 256 - 0 []
512: 512 - 0 []

Сама программа:

program PascalABCdotNET;
function DecToBin(dec: uint64): array of byte;
begin
var bin: array of byte;
var i: byte := 0;
repeat
SetLength(bin, Length(bin) + 1);
bin[i] := dec mod 2;
dec := dec div 2;
i += 1;
until dec = 0;
Result := bin;
end;
function BinToDec(bin: array of byte): uint64;
begin
var dec: uint64;
for var i := 0 to High(bin) do
if i > 0 then dec += Round(Power(bin[i] * 2, i))
else dec += bin[i];
Result := dec;
end;
begin
var ns: set of int64;
for var n := 10 to 1000 do begin
var bin := DecToBin(n);
repeat
SetLength(bin, Length(bin) - 1);
if Length(bin) = 0 then break;
until bin[High(bin)] = 1;
var dec := BinToDec(bin);
if not (n - dec in ns) then begin
ns += [(n - dec)];
writeln((n - dec):4, ': ', n:5, ' - ', dec, #32, bin.Reverse);
end;
end;
end.
Alexey Albrecht
Alexey Albrecht
18 091
Лучший ответ
Alexey Albrecht Для вывода всех чисел закомментируй последний блок if, т. е:

//if not (n - dec in ns) then begin
ns += [(n - dec)];
writeln((n - dec):4, ': ', n:5, ' - ', dec, #32, bin.Reverse);
//end;
Потому, что выведено будет 8 16 32 64 128 256 512.
Т. е. 7 значений.
Объясните, почему число ноль не будет учитываться при подсчете различных чисел, например для числа 25 будет: на первом шаге алгоритма двоичная запись 11001, на втором шаге алгоритма 11001, на третьем шаге алгоритма 25, на четвертом шаге алгоритма автомат вернет разность 25-25 = 0.
Откуда это следует из условия задачи? Спасибо.
Игорь Бабанов
Игорь Бабанов
1 253