Перевод из десятичной системы счисления в двоичную на Leo.
Всем привет! В данной статье мы напишем программу на языке программирования Leo, которая переводит поступившее число из десятичной системы счисления в двоичную. Если вы не читали мои предыдущие статьи и видео, рекомендую с ними ознакомиться. У меня много контента по языку Leo, а также по проекту Aleo.
Данная статья есть в видео-формате по ссылке.
Для начала немного теории. Как перевести число из десятичной системы в двоичную?
Мы берем число, например, 10, и начинаем делить его на 2, сохраняя остаток до того момента, пока число не станет 1 или 0. Потом эти остатки мы записываем в обратном порядке. На картинке выше представлен более наглядный алгоритм действий.
Давайте реализуем этот расчет на языке программирования Leo. Для этого открываем Aleo Studio и создаем новый проект.
Пропишем вход и выход функции. Мы будем принимать и выводить число типа u64. Несмотря на то, что на выходе должно быть двоичное число, по сути, мы лишь показываем двоичную запись числа, записанную в десятичную переменную. Поэтому рекомендую выбирать именно формат u64 и выше, чтобы можно было преобразовать более большие числа.
transition main(a: u64) -> u64 {
Следующим шагом создаем переменную в которой будем хранить остатки от деления числа. Мы зададим ей значение 1, так как первый остаток может быть и 0 и 1, если будет 0, то мы потеряем его. Поэтому мы добавляем в начало 1, которую мы потом уберем.
Теперь создадим переменную, которая будет хранить перевернутое значение, её мы будем выводить по результату работы программы.
Поскольку в leo нет цикла while, мы вынуждены использовать связку цикла for и условного оператора if.
for i:u64 in 0u64..10u64 {
if a > 0u64{
Мы можем перевести максимум 10ти значное число (если необходимо больше, то можно увеличить количество циклов в for). И если a>0, мы выполняем следующее:
result = result * 10u64 + a.rem(2u64);
В переменную result записываем остатки от деления числа на 2 каждый раз в новый разряд (для этого умножаем на 10).
Делим саму переменную a
на 2 для продолжения логики алгоритма.
Таким образом по результатам работы цикла ниже, мы получим число 1 + остатки от деления на 2. На примере 10, это было бы 10101. Теперь нам осталось перевернуть число и убрать первую единицу.
for i:u64 in 0u64..10u64 {
if a > 0u64{
result = result * 10u64 + a.rem(2u64);
a = a / 2u64;
}
}
Для этого по той же логике пишем цикл for и оператор if со следующим содержанием:
for i:u64 in 0u64..10u64 {
if result >= 10u64 {
rev = rev * 10u64 + result.rem(10u64);
result = result / 10u64;
}
}
Мы пишем result >= 10u64
для того чтобы избавиться от 1 в начале. С помощью алгоритма выше, мы переворчаваем наше число. Осталось лишь вывети переменную rev.
program tentotwo.aleo {
transition main(a: u64) -> u64 {
let result: u64 = 1u64;
let rev: u64 = 0u64;
for i:u64 in 0u64..10u64 {
if a > 0u64{
result = result * 10u64 + a.rem(2u64);
a = a / 2u64;
}
}
for i:u64 in 0u64..10u64 {
if result >= 10u64 {
rev = rev * 10u64 + result.rem(10u64);
result = result / 10u64;
}
}
return rev;
}
}
Осталось вписать входные данные и запустить программу.
Мы должны получить результат 1010.
Мы получили корректный результат. Давайте загрузим код в ChatGPT и проверим, поймет ли он суть программы, а также прочитаем объяснение.
Данная программа на языке программирования ALEO представляет собой конвертер числа из десятичной системы счисления в двоичную систему счисления. Давайте разберем суть программы шаг за шагом:
- Программа объявляет функцию
main
, которая принимает аргументa
типаu64
(беззнаковое 64-битное целое число) и возвращает результат также типаu64
. let result: u64 = 1u64;
: Объявляется переменнаяresult
типаu64
и инициализируется значением 1. Эта переменная будет использоваться для хранения числа в двоичной системе.let rev: u64 = 0u64;
: Объявляется переменнаяrev
типаu64
и инициализируется значением 0. Эта переменная будет использоваться для хранения перевернутой версии числа в двоичной системе.- Первый цикл
for
: Этот цикл будет выполняться 10 раз (для каждой цифры в десятичном числе), пока значениеa
больше нуля. Внутри цикла: - Цифра текущего разряда числа
a
в двоичной системе вычисляется какa.rem(2u64)
(остаток от деления на 2). - Затем эта цифра добавляется к переменной
result
, умноженной на 10, чтобы "сдвинуть" все цифры влево и добавить новую цифру справа. - Затем значение
a
делится на 2, чтобы перейти к следующему разряду. - Второй цикл
for
: Этот цикл выполняется, пока значениеresult
больше или равно 10. Внутри цикла: - Цифра текущего разряда числа
result
вычисляется какresult.rem(10u64)
(остаток от деления на 10). - Эта цифра добавляется к переменной
rev
, умноженной на 10, чтобы построить перевернутую версию числа. - Затем значение
result
делится на 10, чтобы удалить обработанный разряд. - На выходе функция возвращает значение переменной
rev
, которое представляет перевернутое двоичное представление исходного десятичного числа.
Таким образом, программа принимает десятичное число, конвертирует его в двоичное.
Итог
Не перестаю удивляться ChatGPT. Порою он действительно очень четко преподносит информацию и одолевает меня на "преподавательском" поле. Надеюсь, данная статья была для вас полезна. До встречи!