e-olymp 7457. Max-Min в двійковій системі счислення

Умова

Вивчаючи двійкову систему числення, Василько вирішив попрактикуватися і придумав таку вправу. Він із бітів числа створював найбільше і найменше число, переставляючи біти, після чого знаходив їх різницю. Проте хлопець не знає, чи правильно виконує вправу. Допоможіть йому. Напишіть програму, яка за даним числом [latex]N[/latex] знаходить різницю між найбільшим і найменшим числом, які утворюються із бітів заданого числа. У найбільшого числа найбільший біт співпадає з найбільшим бітом заданого числа.

Пояснення

[latex]N = 13_{10}[/latex], в двійковій системі числення — [latex]1101_2[/latex], найбільше число [latex]1110_2[/latex] = [latex]14_{10}[/latex], найменше число [latex]0111_2[/latex] = [latex]7_{10}[/latex]. [latex]14-7=7[/latex].

Вхідні дані

В єдиному рядку записане число N ([latex]N<2^{31}[/latex]).

Вихідні дані

Єдине число — відповідь до вправи Василька.

Тести

Вхідні дані Вихідні дані
$2$ $1$
$15$ $0$
$86$ $105$
$1000$ $945$
$40$ $45$

Код програми

Рішення

Процес вирішення даної задачі поділяється на 4 кроки:

  1. За допомогою циклу рахуємо кількість одиниць та нулів у двійковому вигляді поданого числа [latex]n[/latex].
  2. Створимо функцію [latex]max\_number[/latex], яка за поданою кількістю нулів та одиниць буде повертати найбільше число, яке в двійковій формі складатиметься з цієї кількості одиниць та нулів. Очевидно, що отримати найбільше число в двійковому вигляді можна, якщо записати спочатку всі одиниці, а потім — усі нулі.
  3. Створимо функцію [latex]min\_number[/latex], яка за поданою кількістю нулів та одиниць буде повертати найменше число, яке в двійковій формі складатиметься з цієї кількості одиниць та нулів. Зрозуміло, що найменше число буде виглядати навпаки — спочатку будуть стояти всі нулі, а потім — усі одиниці.
  4. Виведемо на екран різницю підрахованих функціями [latex]max\_number[/latex] та [latex]min\_number[/latex] значень.

Посилання

Код програми на ideone
Умова на сайті E-Olymp

2 thoughts on “e-olymp 7457. Max-Min в двійковій системі счислення

  1. Работу я зачел, но кое-что следует поправить.

    • В пояснении стоило упомянуть, что максимальное число получится, если все его единички поставить слева (в старших разрядах), а минимальное — если справа (в младших).
    • Вы пишите «буде рахувати в десятковій формі». Это не так. Вычисления будут всегда проводиться в двоичной и только в двоичной системе счисления. Десятичное представление может появиться только при представлении информации человеку.
    • Мне кажется, Вы используете не то украинское слово для обозначения разности двух чисел. Во всяком случае здесь используют другой термин. Проверьте, пожалуйста.
    • Было бы хорошо зарегистрировать свой почтовый ящик на сайте gravatar.con.

    И еще несколько критических замечаний в которые нужно обязательно вникнуть, но менять ничего не стоит.

    • Функция pow() работает с действительными числами и осуществляет приближенные вычисления использую разложение в ряд. Использовать ее для работы с целыми числами в данном случае можно. Но это сродни забивания гвоздей гранатой — если маленький гвоздь и осторожно, то ничего страшного скорее всего не произойдет. Проблема в том, что это может стать опасной привычкой. Старайтесь избегать этого. Найдите время прочесть на нашем сайте хорошую статью Игоря Вустянюка на тему программирования возведения в целую степень.
    • Если ориентироваться именно на двоичное представление, использовать операции битового сдвига и побитового «И» (&), то код получится гораздо лаконичнее и быстрее. Вам ничего менять не нужно, но для примера можно добавить, как бы это выглядело:

      Как видите, всё очень просто. Единственный тонкий момент в том, что получить двоичное число из $n$ единиц можно по формуле $2^n-1.$
    • 1) В мене було пояснення на другому та третьому кроці, які числа, утворені з поданих бітів, будуть найбільшим та найменшим
      2) Дякую, виправила
      3) Дякую, виправила

Добавить комментарий