Задача
Для заданного положительного целого числа $n$, распечатать позиции всех $1$ в двоичном его представлении. Позиция младшего бита имеет номер $0$.
Позиции $1$ в двоичном представлении числа $13$ — это $0$, $2$, $3$.
Напишите программу, которая для каждого набора данных:
- читает натуральное число $n$,
- вычисляет позиции $1$ в двоичном представлении $n$,
- выводит результат.
Входные данные
В первой строке входного файла содержится одно натуральное число $d$, указывающее количество наборов входных данных, $1 \leq d \leq 10$. Входные данные заданы ниже.
Каждый набор данных состоит ровно из одной строки, содержащей ровно одно целое число $n$, $0 \leq n \leq 10^6$.
Выходные данные
Вывод должен состоять ровно из $d$ строк — по одной строке для каждого набора входных данных.
Строка $i$, $1 \leq i \leq d$, должна содержать возрастающую последовательность целых чисел, разделенных одним пробелом — позиции $1$ в двоичном представлении $i$-го числа, полученного во входных данных.
Тесты
Входные данные
|
Выходные данные |
$3$ $17$ $7$ $5$ |
$0$ $4$ $0$ $1$ $2$ $0$ $2$ |
$4$ $1945$ $1337$ $1000000$ $999999$ |
$0$ $3$ $4$ $7$ $8$ $9$ $10$ $0$ $3$ $4$ $5$ $8$ $10$ $6$ $9$ $14$ $16$ $17$ $18$ $19$ $0$ $1$ $2$ $3$ $4$ $5$ $9$ $14$ $16$ $17$ $18$ $19$ |
$10$ $0$ $1$ $2$ $3$ $4$ $5$ $6$ $7$ $8$ $9$ |
$0$ $1$ $0$ $1$ $2$ $0$ $2$ $1$ $2$ $0$ $1$ $2$ $3$ $0$ $3$ |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> using namespace std; int main() { int d; cin >> d; for (int j = 0; j < d; ++j){ int n; bool w = false; cin >> n; for (int i = 0; n>0; ++i){ if (n % 2 == 1){ if(w) cout << " "; w = true; cout << i; } n /= 2; } cout << endl; } return 0; } |
Решение задачи
Для решения этой задачи нужно понять, что остаток от деления $n$ на $2$ это последняя цифра в двоичном коде числа $n$, а деление целочисленной переменной $n$ на $2$ это отбрасывание последней цифры в двоичном коде. Цикл с счетчиком $i$ до момента, как $n$ не станет равняться $0$, очевиден, как и внешний цикл от $0$ до $d$, который реализовывает $d$ итераций ввода числа $n$. Стоит отметить, что тесты на e-olymp (все, кроме первого) чувствительны к пробелам в конце строки, из-за чего появляется необходимость каким-то образом его избежать.
Ссылки
Условие задачи на e-olymp
Код решения на ideone.com
Да, действительно я как-то перепутал слово binary и decimal. Даже не заметил это, за все время. Немного стыдно, но уже исправил, будто и не было.
Действительно, превосходства второго кода над первым нет. Единственное что, в нем отделен процесс преобразования из десятичной в двоичную и вывода. Лучше тогда оставлю только первый.