Код программы ruby for i in "1000".to_i(8).."7777".to_i(8) s = i.to_s(2) k = 0 s.chars.each {|c| k += 1 if c == "1"} if (k==5) p [i, i.to_s(8), s, k] break end end
Вывод [527, "1017", "1000001111", 5]
ответ 1017
Если решать аналитически, то наверное это делается методом подбора плюс быстрым переводом восьмеричной системы в двоичную (каждая цифра 8чной переводится в 3 цифры 2чной, можно заранее посчитать кол-во единиц для каждой). Сразу понимаем что в числах 1000-1016 будет слишком мало единиц, только "7"_8 переводится в "111"_2. И еще две единицы дают "1"_8
Суть двоичной системы в том, что любое число передается последовательностью нулей (0) и единиц (1).
Чтобы перевести число в двоичную систему, необходимо сначала определить ближайшую (наибольшую возможную) степень двойки для этого числа, потом расставить нисходящий ряд степеней от этой степени до 2^0 (то есть, 1), и в конце, составить число из наибольших доступных частей.
Допустим, мы хотим перевести число 35 в двоичный вид. Ближайшая степень - 32 (2^5). Следовательно, мы составляем ряд, где каждая единица (1) отвечает за часть нашего числа в виде степени двойки. То есть, ряд из 6 (отсчет от 5 до 0) цифр, где первая (которая отвечает за 2^5=32) будет единицей, выглядит так: 10000. Имеем 32. Нужно добавить 3. 3 из степеней двойки - это 2 + 1, следовательно, предпоследняя и последняя цифры ряда. "Переключаем" их на единицы. Имеем 100011 - это 35.
Следовательно, чтобы совершить обратный переход, нужно посчитать количество цифр и отнять от него единицу - это и будет максимальная (самая левая) степень двойки. Дальше - снижаем степень с каждой следующей цифрой, пока не дойдем до 2 (2^1), а потом - 1 (2^0).
Пример: 101000 - 6 цифр, самая левая будет 2^5=32. 32 + 8 (2^5-2^4-2^3) = 40
мне кажется где свободно 700 с чемто
Объяснение: