Содержание
Задача: написать рекурсивный метод перевода любого целого десятичного числа в двоичную систему, например, 78 = 01001110.
Теоретическая часть
Чтобы перевести число из десятичной системы в двоичную необходимо последовательно делить число на 2 до тех пор, пока частное от деления не станет равным нулю и, затем, переписать остатки от деления в обратном порядке. Например, возьмем число 78. Производим последовательное деление:
- 78÷ 2 = 39 (в остатке 0);
- 39 ÷ 2 = 19 (в остатке 1);
- 19 ÷ 2 = 9 (в остатке 1);
- 9 ÷ 2 = 4 (в остатке 1);
- 4 ÷ 2 = 2 (в остатке 0);
- 2 ÷ 2 =1 (в остатке 0);
- 1 ÷ 2 = 0 (в остатке 1).
Записываем остатки от деления на 2 в обратном порядке и получаем следующую последовательность: 1001110. Это и будет двоичное представление числа 78.
Так как все промежуточные вычисления в рекурсивных методах сохраняются в стеке, то это позволяет нам без лишних действий по перестановке местами чисел 0 и 1 написать рекурсивный метод (в стеке действует правило «LIFO — Last In First Out» — последний пришел — первый вышел).
Перевод числа из десятичной системы в двоичную с использованием рекурсии
Развернутый вариант метода перевода десятичного числа в двоичную систему с использованием рекурсии:
static string DecToBin(int n)
{
if (n == 0) //базовый сценарий - выход из рекурсии
return "0";
if (n / 2 > 0)
return DecToBin(n / 2) + (char)(n % 2 + '0');
else
return ""+ (char)(n % 2 + '0');
}
Этот же метод можно записать с использованием тернарной операции (сокращенной проверкой) следующим образом:
static string DecToBin(int n)
{
return (n / 2 > 0 ? DecToBin(n / 2) : "") + (char)(n % 2 + '0');
}
Проверим работу метода. Для этого мы можем воспользоваться обычным калькулятором. Переведем число 50 в двоичную систему:
Проведем теперь операцию перевода в двоичную систему, используя нашу программу:
static void Main(string[] args)
{
Console.WriteLine(DecToBin(50));
}
Результат в консоли:
Ведущие нули роли не играют, так как при переводе из двоичной систему в десятичную они никак не повлияют на результат.
Решение лабораторной работы (исходный код)
Ниже представлен исходный код программы для перевода любого числа из десятичной системы в двоичную:
namespace ConsoleApp1
{
internal class Program
{
static string DecToBin(int n)
{
return (n / 2 > 0 ? DecToBin(n / 2) : "") + (char)(n % 2 + '0');
}
static void Main(string[] args)
{
Console.Write("Введите число. N = ");
string str = Console.ReadLine();
int n;
if (int.TryParse(str, out n))
Console.WriteLine(DecToBin(n));
else
Console.WriteLine("Ошибка ввода");
}
}
}
Результат работы программы:
110010
Итого
Сегодня мы разработали консольное приложение для перевода числа из десятичной системы в двоичную, используя рекурсию. Благодаря тому, что в рекурсивных методах используется стек, нам не пришлось проводить никаких дополнительных преобразований полученной строки, представляющей число в двоичной форме. Стоит отметить, что в C# имеются готовые методы для таких операций преобразования.
