Умова
Вивчаючи двійкову систему числення, Василько вирішив попрактикуватися і придумав таку вправу. Він із бітів числа створював найбільше і найменше число, переставляючи біти, після чого знаходив їх різницю. Проте хлопець не знає, чи правильно виконує вправу. Допоможіть йому. Напишіть програму, яка за даним числом [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$ |
Код програми
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include <iostream> #include <iomanip> #include <cmath> long long max_number(long long n1, long long n0) { long long number; for (int i=n0+n1-1; i>=n0; i--) { number+=pow(2, i); } return(number); } long long min_number(long long n1, long long n0) { long long number; for (int i=n1-1; i>=0; i--) { number+=pow(2, i); } return(number); } int main() { long long n; cin >> n; long long n1=0; long long n0=0; while (n>0) { if (n%2==1) n1++; else n0++; n/=2; } cout << max_number (n1, n0) - min_number (n1, n0); return 0; } |
Рішення
Процес вирішення даної задачі поділяється на 4 кроки:
- За допомогою циклу рахуємо кількість одиниць та нулів у двійковому вигляді поданого числа [latex]n[/latex].
- Створимо функцію [latex]max\_number[/latex], яка за поданою кількістю нулів та одиниць буде повертати найбільше число, яке в двійковій формі складатиметься з цієї кількості одиниць та нулів. Очевидно, що отримати найбільше число в двійковому вигляді можна, якщо записати спочатку всі одиниці, а потім — усі нулі.
- Створимо функцію [latex]min\_number[/latex], яка за поданою кількістю нулів та одиниць буде повертати найменше число, яке в двійковій формі складатиметься з цієї кількості одиниць та нулів. Зрозуміло, що найменше число буде виглядати навпаки — спочатку будуть стояти всі нулі, а потім — усі одиниці.
- Виведемо на екран різницю підрахованих функціями [latex]max\_number[/latex] та [latex]min\_number[/latex] значень.
Посилання
Код програми на ideone
Умова на сайті E-Olymp
Работу я зачел, но кое-что следует поправить.
И еще несколько критических замечаний в которые нужно обязательно вникнуть, но менять ничего не стоит.
Как видите, всё очень просто. Единственный тонкий момент в том, что получить двоичное число из $n$ единиц можно по формуле $2^n-1.$
1) В мене було пояснення на другому та третьому кроці, які числа, утворені з поданих бітів, будуть найбільшим та найменшим
2) Дякую, виправила
3) Дякую, виправила