Сколько единиц в двоичной записи числа 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. Хочу узнать, как получить такой же ответ на бумаге? Желательно с подробным объяснением.


лекция: https://inf-ege.sdamgia.ru/test?theme=247
MrSolution: Здравствуйте! Как, кажется, замечано выше, похожие задачи есть на решу егэ. Поэтому вопро: Вам еще нужно решение? Если да, то напишу в течении завтрашнего дня, если не забуду.
Lonz0f: Здравствуйте, да, всё еще нужно
MrSolution: Постарался объяснить максимально просто, надеюсь, что получилось.
Если нет, то прости :(

Ответы

Ответ дал: MrSolution
4

Ответ:

(см. объяснение)

Объяснение:

Поскольку после предложенного автору вопроса варианта знакомства с достаточно формальным объяснением на РешуЕГЭ, у него остались вопросы, попробую объяснить максимально неформально.

Итак, начнем:

8^{4024}-4^{1605}+2^{1024}-126=2^{12072}-2^{3210}+2^{1024}-2^7+2^1

Как можно заметить, первым шагом мы перешли к степеням двойки.

Теперь проведем аналогию. У нас система счисления привычная нам десятичная. И у нас 10^1=10,\;10^2=100,,\;10^3=1000... и так далее. Возникает вопрос: "А не будет ли в двоичной сс что-то похожее?" Ответ очевиден: будет. Действительно, 2^1=10_2,\;2^2=100_2,\;2^3=1000_2.

Тогда что такое 2^{12072}? Правильно. Это 1 и еще 12072 нулей после него в двоичной сс. Возникает новый вопрос: "А можно ли это как-то использовать?" Ответ: да, можно, а более того и нужно. Сколько будет 2^{10}+2^{5} в двоичной сс? Конечно же 10000100000_2 (единица, 4 нуля, единица, 5 нулей). Почему так? потому что из вышесказанного следует 2^{10}=10000000000_2, а 2^5=100000_2. Такое сложение делается в уме. Его результат ясен сразу, что является главным достоинством в нашем деле. Теперь к нашему примеру. Забудем пока про вычитание. Что будет, если вычислить 2^{12072}+2^{1024}+2^{1}? Как уже догадался читатель, ответ будет такой формы: 10000....0001000...00001_2. Я намеренно не пишу все нули и ставлю троеточия. А зачем их писать? Выписываем только те части, которые нам нужны. Знаем, что они там есть и хорошо. Бумагу надо экономить! Просто укажем сколько их там, например, вот таким способом:

1\underbrace{0000....000}_{11047}1\underbrace{000...0000}_{1023}1_2

Теперь к вычитаниям. Нам надо вычесть из этого числа 2^{3210} и 2^{7}.

Снова отойдем от задачи, чтобы понять идею. У нас есть выражение 2^{5}-2^{3}. Как это считать? Как уже привыкли столбиком. Будет 11000_2=24_{10}. В нашем случае я всегда вычитаю пошагово. То есть сначала 2^{3210}, потом 2^7.

Здесь неудобно писать формулы, прошу посмотреть прикрепленный файл. Там процесс вычитания описан несколько более подробно, чем так, как я бы решал эту задачу с набитой рукой. Как видим, ответ получился 9880.
Я старался объяснить максимально просто, понятно и на вашем языке. Надеюсь, что у меня это получилось и я не запутал вас окончательно. Вообще, задача несложная и решается за минуту спокойно, а объяснение вышло громоздкой отчасти из-за обилия отступлений.

Задание выполнено!

Комментарий:

Позволю себе заметить, что автор, судя по всему не зная питона, берется программировать на нем, а это плохо.

Почему бы не написать что-то такое?

print(str(bin((8**4024)-(4**1605)+(2**1024)-126)).count('1'))

Не понимаю уместности цикла for.

Приложения:

Lonz0f: Хотел бы задать вопрос, почему изначальное 10000..00100..0001 не имеет на конце нуля? Он является незначащим?
MrSolution: Постараюсь объяснить на вашем языке:
Незначащие нули - это такие нули, которые при прочтении числа слева направо стоят до первого отличного от нуля числа. Что они есть, что их нет, от этого значение числа не меняется. Напиши хоть 01, хоть 00000001, все равно - это 1. Поскольку такие нули не имеют для числа никакого значения
MrSolution: (число не поменяется при их добавлении или убирании), они называются незначащие. Теперь рассмотрим Ваш случай: 01 - это 1 в десятичной сс, а 10 - это 2 в десятичной сс. Мы видим, что такие нули влияют на значение числа, а => называться незначащими не могут. Там в условии
MrSolution: 2^1=10_2, а я написал как для 2^0=1_2 почему-то :( там действительно число кончается на 10, а не на 01. Решение уже заблокировано для редактирования, извините, не поправлю. Но идея и ход решения в нем все равно передается. Рекомендую обратиться к порталу РешуЕГЭ и порешать типовые задачи там. Кстати, умение находить опечатки в чужих решениях является признаком высшей степени познания темы. Поздравляю с освоением задания :) Идите, и побеждайте на экзаменах!
Вас заинтересует