Поиск количества пар в числе, которые делятся друг на друга в Aleo.
Привет! Продолжаем с вами изучать язык программирования Leo. Для тех кто здесь впервые напоминаю, что Leo - это язык программирования, созданный компанией Aleo для создания приложений на технологии доказательств с нулевым знанием (ZKP). В своих статьях и видео я вместе с вами изучаю данный язык программирования и делюсь своим опытом.
Для начала давайте покажу вам полный текст задачи:
Напишите функцию, которая возвращает количество пар в числе, в которых одна цифра из пары делится на другую цифру из пары. Под парой подразумевается две идущие подряд цифры. Например, в числе 1256, парами являются следующие сочетания цифр: 1 и 2, 2 и 5, 5 и 6. Программа получает на вход целое число. Программа должна вывести количество пар, в которых одно число делится на другое.
Я думаю условия понятны, поэтому давайте приступать.
P.S. Если вам удобнее изучать информацию в видео-формате, то вот ссылка на мой ролик по созданию данной функции.
Открываем Aleo Studio или просто создаём проект в Git Bash через командную строку. В этот раз я буду показывать на примере Aleo Studio (как работать с Git Bash я не раз показывал в своих статьях, можете изучить). Создаем программу, нажимая New leo project. Я назову его delenie.
Нажимаем create и ждем, когда проект будет создан. Если у вас что-то не грузится, то можете перезайти в Aleo Studio или попробовать закрыть и открыть вкладку с программой.
Итак, создалась базовая программа. Давайте её видоизменять.
Начнём со входных данных. В программу поступает одно 4х-значное число. Пусть это будет переменная а
типа u32. На выходе же переменная также типа u32. Первая строка функции будет выглядеть следующим образом:
transition main(a: u32) -> u32 {
Далее давайте сразу создадим переменную, которая будет хранить в себе количество пар, которые делятся без остатка, её мы будем возвращать.
let count: u32 = 0u32;
Следующим действием мы должны записать в отдельные переменные все цифры числа. Давайте сделаем это. Для этого нам нужно находить остаток от деления числа на 10. Таким образом, мы будем получать последнюю цифру числа.
let n_1: u32 = a.rem(10u32);
Теперь, чтобы найти предпоследнюю цифру числа мы делим число на 10 и снова находим остаток от деления данного числа на 10. В коде это выглядит так:
a = a/10u32; let n_2: u32 = a.rem(10u32);
Теперь нам нужно повторить это действие для еще двух цифр числа.
a = a/10u32; let n_3: u32 = a.rem(10u32); a = a/10u32; let n_4: u32 = a.rem(10u32);
Таким образом мы получили все цифры числа. Теперь нужно лишь вычислить, делятся ли они друг на друга. Делать мы будем это опять с помощью оператора .rem
.
if n_1.rem(n_2) == 0u32 n_2.rem(n_1) == 0u32{ count = count + 1u32; }
Оно проверяет, если первая цифра делится на вторую без остатка (с остатком 0) или вторая цифра делится на первую без остатка, тогда мы добавляем к переменной count 1. Теперь нам нужно сделать это ещё для двух пар чисел.
if n_2.rem(n_3) == 0u32 n_3.rem(n_2) == 0u32{ count = count + 1u32; } if n_3.rem(n_4) == 0u32 || n_4.rem(n_3) == 0u32{ count = count + 1u32; }
Остаётся вернуть переменную count по результату работы функции. Для этого пишем:
return count;
program delenie.aleo { transition main(a: u32) -> u32 { let count: u32 = 0u32; let n_1: u32 = a.rem(10u32); a = a/10u32; let n_2: u32 = a.rem(10u32); a = a/10u32; let n_3: u32 = a.rem(10u32); a = a/10u32; let n_4: u32 = a.rem(10u32); if n_1.rem(n_2) == 0u32 n_2.rem(n_1) == 0u32{ count = count + 1u32; } if n_2.rem(n_3) == 0u32 n_3.rem(n_2) == 0u32{ count = count + 1u32; } if n_3.rem(n_4) == 0u32 || n_4.rem(n_3) == 0u32{ count = count + 1u32; } return count; } }
Теперь переходим ко входным данным. Указываем значение переменной а
.
Для начала протестируем функцию на числе 1234. Здесь лишь 2 делится на 1, так что на выходе мы должны получить 1 (то есть одна пара делится). Запускаем нашу программу и получаем следующий результат.
Да, всё правильно. Если же мы запустим программу с числом 5234.
То получим 0, то есть цифры не делятся друг на друга.
На этом всё! Надеюсь, данная статья была вам полезна. Можете задавать вопросы в комментариях.