Умова
Вивчаючи двійкову систему числення, Василько вирішив попрактикуватися і придумав таку вправу. Він із бітів числа створював найбільше і найменше число, переставляючи біти, після чого знаходив їх різницю. Проте хлопець не знає, чи правильно виконує вправу. Допоможіть йому. Напишіть програму, яка за даним числом $N$ знаходить різницю між найбільшим і найменшим числом, які утворюються із бітів заданого числа. У найбільшого числа найбільший біт співпадає з найбільшим бітом заданого числа.
Пояснення
$N=13_{10}$, в двійковій системі числення — $1101_2$, найбільше число $1110_2 = 14_{10}$, найменше число $0111_2 = 7_{10}$. $14−7=7$.
Вхідні дані
В єдиному рядку записане число $N (N<2^{31})$.
Вихідні дані
Єдине число — відповідь до вправи Василька.
Тести
Вхідні дані | Вихідні дані |
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 41 42 43 |
import java.util.*; import java.lang.*; import java.io.*; class Main { public static double max_number(int n1, int n0){ double number = 0; for (int i = n0+n1-1; i >= n0; i = i-1) { number += Math.pow(2, i); } return (number); } public static double min_number(int n1, int n0) { double number = 0; for (int i = n1-1; i >= 0; i = i-1) { number = number + Math.pow(2, i); } return(number); } public static void main (String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); int n = in.nextInt(); int n1=0; int n0=0; while (n>0) { if (n%2==1){ n1=n1+1; } else{ n0+=1; } n/=2; } int res = (int) max_number(n1, n0) - (int) min_number(n1, n0); System.out.print(res); } } |
Рішення
Процес вирішення даної задачі поділяється на 4 кроки:
- За допомогою циклу рахуємо кількість одиниць та нулів у двійковому вигляді поданого числа $n$.
- Створимо функцію $max_number$, яка за поданою кількістю нулів та одиниць буде повертати найбільше число, яке в двійковій формі складатиметься з цієї кількості одиниць та нулів. Очевидно, що отримати найбільше число в двійковому вигляді можна, якщо записати спочатку всі одиниці, а потім — усі нулі.
- Створимо функцію $min_number$, яка за поданою кількістю нулів та одиниць буде повертати найменше число, яке в двійковій формі складатиметься з цієї кількості одиниць та нулів. Зрозуміло, що найменше число буде виглядати навпаки — спочатку будуть стояти всі нулі, а потім — усі одиниці.
- Виведемо на екран різницю підрахованих функціями $max_number$ та $min_number$ значень.
Посилання
Умова на e-olymp
Вирішення мовою C++ з поясненнями
Код на java