Можно применить "жадный" алгоритм. Суть такова: на каждой итерации мы подбираем максимальную степень двойки, меньшую либо равную текущему числу. Запоминаем её как одно из слагаемых и отнимаем от числа. Повторяем до тех пор, пока число не станет равным 0.
Пример: разложим число 123.
Максимальная степень двойки, меньшая или равная 123 - 64. Запоминаем 64, отнимаем его от 123, получаем 59.
Максимальная степень двойки, меньшая или равная 59 - 32. Запоминаем 32, отнимаем его от 59, получаем 27.
Максимальная степень двойки, меньшая или равная 27 - 16. Запоминаем 16, отнимаем его от 27, получаем 11.
Максимальная степень двойки, меньшая или равная 11 - 8. Запоминаем 8, отнимаем его от 11, получаем 3.
Максимальная степень двойки, меньшая или равная 3 - 2. Запоминаем 2, отнимаем его от 11, получаем 1.
Максимальная степень двойки, меньшая или равная 1 - 1. Запоминаем 1, отнимаем его от 1, получаем 0.
Алгоритм закончил работу, в результате 123 = 64 + 32 + 16 + 8 + 2 + 1.
Источник:
http://ru.stackoverflow.com/questions/334200/Алгор...