November 19, 2023

Поиск количества пар в числе, которые делятся друг на друга в 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, то есть цифры не делятся друг на друга.

На этом всё! Надеюсь, данная статья была вам полезна. Можете задавать вопросы в комментариях.