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

Ю3.11

Задача.

Получить таблицу пересчета миль в километры и обратно (1 миля=1,609344 км) для расстояний,не превышающих км, в следующем виде:

мили км
0,6214 1,0000
1,0000 1,6093
1,2428 2,0000
1,8641 3,0000
2,0000 3,2187

Тесты.

Ввод Вывод
k
3 mile     km
0.6214 1.0000
1.0000 1.6093
1.2427 2.0000
1.8641 3.0000
7 mile     km
0.6214 1.0000
1.0000 1.6093
1.2427 2.0000
1.8641 3.0000
2.0000 3.2187
2.4855 4.0000
3.0000 4.8280
3.1069 5.0000
3.7282 6.0000
4.0000 6.4374
4.3496 7.0000
0 mile      km
3.3 mile     km
0.6214 1.0000
1.0000 1.6093
1.2427 2.0000
1.8641 3.0000
2.0000 3.2187

 

 

 

Решение.

 

Читаем значение k. В цикле имеем два значения n  и i, значение  увеличиваем в каждом витке цикла, а значение  тогда, когда значение [latex]i/1.609344[/latex] превысит значение n. Пока этого не произошло печатаем значения соответствующие км и [latex]i/1.609344[/latex] милям. Когда-же значение [latex]i/1.609344[/latex] превысило значение n проверяем, если значение [latex]n\times 1.609344[/latex] меньше или равно печатаем строку, где значения миль равно n, а значение км [latex]n\times 1.609344[/latex], потом проверяем если значение i  меньше или равно значению k, то печатаем строку, где значение миль равно[latex]i/1.609344[/latex]а значение км равно i. То есть для подсчёта целых значений миль используем параметр n, а для подсчёта целых значений км параметр i.

Ю1.1

Задача.

Из градусов в радианы. Угол α задан в градусах, минутах и секундах. Найти его величину в радианах(с максимально возможной точностью).

Тесты.

Ввод Вывод
градусы(grad) минуты(min) Секунды(sec) радианы(rad)
0 0 0 0
90 0 0 1.570796326794897
179 59 60 3.141592653589793
-270 0 0 -4.7123889803847

 

 

 

 

Решение.

Обозначим через переменные grad, min,  sec  число градусов, минут, секунд.

1 градус= 60 минут= 3600 секунд.

Сначала проверяем число градусов больше 3600  или нет. Если меньше то ничего не меняем, а если больше то от числа градусов отнимаем 360 до тех пор пока оно не станет меньше 360. После используем формулы перевода градусов, минут и секунд в радианы:

[latex]\mathit{rad=grad\frac{\pi }{180}}[/latex]

 

[latex]\mathit{rad=min\frac{\pi }{180}/60}[/latex]

 

[latex]\mathit{rad=sec\frac{\pi }{180}/3600}[/latex]

Если число градусов положительно то используем конечную формулу:

[latex]\mathit{rad=grad\frac{\pi }{180}+min\frac{\pi }{180}/60+sec\frac{\pi }{180}/3600}[/latex]

Если же оно отрицательно то используем другую формулу:

[latex]\mathit{rad=grad\frac{\pi }{180}-min\frac{\pi }{180}/60-sec\frac{\pi }{180}/3600}[/latex]

 

Ю1.3

Задача.

Длина отрезка задана в дюймах (1 дюйм = 2,54 см). Перевести значение длины в метрическую системы, т.е. выразить её в метрах, сантиметрах и миллиметрах. Например, 21 дюйм = 0 м 53 см 3,4 м.

Тесты.

Ввод Вывод
0 0 м  0 см  0 мм
0.3 0 м  0 см  7.62 мм
21 0 м  53 см  3.4 мм
40.5 1 м  2 см  8.7 мм
100 2 м  54 см  0 мм
5000 127 м  0 см  0 мм

Код.

Ideone (C++)

Код (Java)

Ideone (Java)

Решение.

Обозначим через  [latex] x [/latex]  длину в дюймах, которую вводит пользователь; через   [latex] y [/latex]  длину в миллиметрах.  Согласно формуле перевода,  [latex] y = 25.4 \cdot x[/latex].

Один метр есть тысяча миллиметров. Чтобы получить целое число метров, содержащихся в   [latex] y[/latex] , разделим   [latex] y[/latex]  на тысячу и извлечём целую часть:    [latex] m = \left[\frac{x}{1000} \right][/latex].

Один сантиметр есть десять миллиметров. Избавимся от метров, разделим полученное число на десять и извлечём целую часть — получим целое число сантиметров, содержащихся в   [latex] y [/latex]:  [latex] y = \left[\frac{y-1000\cdot m}{10} \right] [/latex]

Оставшееся — число миллиметров:   [latex] mm = y — 1000 \cdot m — 10 \cdot cm [/latex] .