«Квант» — научно-популярный физико-математический журнал (издаётся с 1970 года)
Старый сайт журнала: kvant.ras.ru

Задача М1086

Условие задачи (1988, № 2) Задача М1086 // Квант. — 1988. — № 2. — Стр. 26; 1988. — № 6. — Стр. 28.

С числом разрешается производить две операции: «увеличить в 2 раза» и «увеличить на 1». За какое наименьшее число операций можно из числа 0 получить:

  1. число 100?
  2. число $n$‍?

М. В. Сапир


Изображения страниц

Решение задачи (1988, № 6) Задача М1086 // Квант. — 1988. — № 2. — Стр. 26; 1988. — № 6. — Стр. 28.

а), б) Задачу удобно решать с конца, т. е. искать кратчайший способ получения числа 0 из произвольного натурального $n$‍‍ с помощью двух операций — вычитания 1 (В) и деления пополам (Д). Пусть $r(n)$‍‍ — число операций В и Д в таком кратчайшем алгоритме. Если число $n$‍‍ нечётно, то к нему можно применить только операцию В, так что $$ r(2k+1)=1+r(2k). $$ Покажем индукцией по $k$‍,‍ что $r(2k)=1+r(k)$‍,‍ т. е. чётное число в кратчайшем алгоритме надо делить пополам. Для $k=1$‍‍ это ясно. Пусть это доказано для всех чисел, меньших $k$‍.‍ Если к числу $2k$‍‍ сначала применить операцию В (вычесть 1), то число операций до получения 0 будет не меньше, чем $$ 1+r(2k-1)=2+r(2k-2)=3+r(k-1) $$ (по предположению индукции). Если же сначала делить $2k$‍‍ пополам, а дальше идти по оптимальному пути, то число операций будет $1+r(k)\le2+r(k-1)$‍.‍ Таким образом, второй способ заведомо быстрее.

$ \def\|{\downarrow}\def\d{\text{Д}}\def\v{\text{В}} \begin{array}{ccc} 100&&1100100\\ \|&\d^2=\d\cdot\d&\|\\ 25&&11001\\ \|&\v&\|\\ 24&&11000\\ \|&\d^3&\|\\ 3&&11\\ \|&\v&\|\\ 2&&10\\ \|&\d&\|\\ 1&&1\\ \|&\v&\|\\ 0&&0 \end{array}$‍

Чтобы узнать, сколько операций потребуется в кратчайшем алгоритме для заданного числа $n$‍,‍ представим $n$‍‍ в виде суммы степеней двойки: $$n=2^{k_1}+2^{k_1+k_2}+\ldots+2^{k_1+k_2+\ldots+k_m},$$ где $k_1$‍‍ неотрицательное, а $k_2$‍,$\ldots$‍,$k_m$‍‍ — положительные целые числа ($k_1$‍,$k_1+k_2$‍,$\ldots$‍‍ — это номера разрядов двоичной записи $n$‍,‍ в которых стоят единицы). Тогда $$ \begin{gather*} r(n)=k_1+r{\left(\dfrac n{2^{k_1}}\right)}=k_1+1+r(2^{k_2}+\ldots+2^{k_2+\ldots+k_m})=\ldots\\ \ldots=(k_1+1)+(k_2+1)+\ldots+(k_m+1)=\\ =(k_1+k_2+\ldots+k_m)+m=[\log_2n]+m \end{gather*} $$ ($[x]$‍‍ — целая часть $x$‍),‍ поскольку $k_1+k_2+\ldots+k_m$‍‍ — это показатель наибольшей степени двойки, не превосходящей $n$‍.‍ Отметим, что $m$‍‍ равно количеству единиц в двоичной записи числа $n$‍.‍ В частности, для $n=100$‍‍ получаем ответ к задаче а): $r(100)=9$‍

На полях показано превращение числа 100 в 0 в десятичной и двоичной записи. Поскольку $100=2^6+2^5+2^2$‍,‍ получаем $r(100)=6+3=9$‍.

М. В. Сапир


Метаданные Задача М1086 // Квант. — 1988. — № 2. — Стр. 26; 1988. — № 6. — Стр. 28.

Предмет
Математика
Условие
Решение
Номера

1988. — № 2. — Стр.  [условие]

1988. — № 6. — Стр.  [решение]

Описание
Задача М1086 // Квант. — 1988. — № 2. — Стр. 26; 1988. — № 6. — Стр. 28.
Ссылка
https://www.kvant.digital/problems/m1086/