Сколько единиц в двоичной записи числа 8^4024 – 4^1605 + 2^1024 – 126?
Для решения задачи, я написал следующую программу на языке Python:
num = str(bin((8**4024)-(4**1605)+(2**1024)-126))
container = 0
for i in range(len(num)):
if num[i]=="1":
container+=1
print(container)
Проверив программу на других подобных заданиях, решил что она рабочая. Ответом служит число 9880. Хочу узнать, как получить такой же ответ на бумаге? Желательно с подробным объяснением.
Answers & Comments
Ответ:
(см. объяснение)
Объяснение:
Поскольку после предложенного автору вопроса варианта знакомства с достаточно формальным объяснением на РешуЕГЭ, у него остались вопросы, попробую объяснить максимально неформально.
Итак, начнем:
Как можно заметить, первым шагом мы перешли к степеням двойки.
Теперь проведем аналогию. У нас система счисления привычная нам десятичная. И у нас и так далее. Возникает вопрос: "А не будет ли в двоичной сс что-то похожее?" Ответ очевиден: будет. Действительно, .
Тогда что такое ? Правильно. Это и еще нулей после него в двоичной сс. Возникает новый вопрос: "А можно ли это как-то использовать?" Ответ: да, можно, а более того и нужно. Сколько будет в двоичной сс? Конечно же (единица, 4 нуля, единица, 5 нулей). Почему так? потому что из вышесказанного следует , а . Такое сложение делается в уме. Его результат ясен сразу, что является главным достоинством в нашем деле. Теперь к нашему примеру. Забудем пока про вычитание. Что будет, если вычислить ? Как уже догадался читатель, ответ будет такой формы: . Я намеренно не пишу все нули и ставлю троеточия. А зачем их писать? Выписываем только те части, которые нам нужны. Знаем, что они там есть и хорошо. Бумагу надо экономить! Просто укажем сколько их там, например, вот таким способом:
Теперь к вычитаниям. Нам надо вычесть из этого числа и .
Снова отойдем от задачи, чтобы понять идею. У нас есть выражение . Как это считать? Как уже привыкли столбиком. Будет . В нашем случае я всегда вычитаю пошагово. То есть сначала , потом .
Здесь неудобно писать формулы, прошу посмотреть прикрепленный файл. Там процесс вычитания описан несколько более подробно, чем так, как я бы решал эту задачу с набитой рукой. Как видим, ответ получился .
Я старался объяснить максимально просто, понятно и на вашем языке. Надеюсь, что у меня это получилось и я не запутал вас окончательно. Вообще, задача несложная и решается за минуту спокойно, а объяснение вышло громоздкой отчасти из-за обилия отступлений.
Задание выполнено!
Комментарий:
Позволю себе заметить, что автор, судя по всему не зная питона, берется программировать на нем, а это плохо.
Почему бы не написать что-то такое?
print(str(bin((8**4024)-(4**1605)+(2**1024)-126)).count('1'))
Не понимаю уместности цикла for.
Незначащие нули - это такие нули, которые при прочтении числа слева направо стоят до первого отличного от нуля числа. Что они есть, что их нет, от этого значение числа не меняется. Напиши хоть 01, хоть 00000001, все равно - это 1. Поскольку такие нули не имеют для числа никакого значения