March 14, 2024

Признаки делимости на Leo [часть 2]

Привет! В данной статье мы закончим нашу программу, которая определяет делится ли веденное нами пятизначное число, на числа, которые имеют признаки делимости. Мы проверяем эти числа по этим признакам:

Напоминаю, что Leo - это язык программирования для работы с блокчейном Aleo, главными преимуществами которого являются программируемость и приватность.

В прошлой статье мы подготовились к проверке, например, записали все цифры числа в отдельные переменные, а также проверили первые два числа. На данный момент наш код выглядит так:

program delimost.aleo {
    transition main(a: u32) -> (bool, bool, bool, bool, bool, bool, bool, bool) {
        let del_2: bool = false;
        let del_3: bool = false;
        let del_5: bool = false;
        let del_9: bool = false;
        let del_10: bool = false;
        let del_4: bool = false;
        let del_25: bool = false;
        let del_11: bool = false;
        let n_5: u32 = a.rem(10u32);
        a = a/10u32;
        let n_4: u32 = a.rem(10u32);
        a = a/10u32;
        let n_3: u32 = a.rem(10u32);
        a = a/10u32;
        let n_2: u32 = a.rem(10u32);
        a = a/10u32;
        let n_1: u32 = a.rem(10u32);
        if n_5.rem(2u32) == 0u32 {
            del_2 = true;
        }
        if (n_5 + n_4 + n_3 + n_2 + n_1).rem(3u32) == 0u32 {
            del_3 = true;
        }
    }
}

Сегодня же мы проверим остальные 6 чисел и выведем результат работы нашей программы.

Число делится на 5, если последняя цифра числа 5 или 0. Мы берём последнее число, которое хранится в переменной n_5 и проверяем равно ли оно 0 или 5, если это так, то переменной del_5 задаем значение true.

Теперь переходим к 9. Мы должны найти сумму всех цифр (то есть сложить переменные n_1...n_5) и проверить с помощью оператора .rem делится ли полученная нами сумма без остатка на 9. Если это так, то задаём переменной del_9 значение true. Этот пункт делается по аналогии с проверкой деленимости на 3.

Проверим деление на 10. Для этого достаточно определить, является ли послежняя цифра числа нулём. Если это так, то переменная del_10 будет иметь значение true.

С делением на 4 всё достаточно интересно. Нам нужно получить две последних цифры числа, но просто сложить их недостаточно, поэтому сначала нам нужно увеличить разряд предпоследнего числа, умножив на 10 и уже к нему прибавить последнее число. Если это число делится на 4 без остатка, то и наше пятизначное число делится на 4, соответсвенно переменная del_4 будет иметь значение true.

Деление на 25 проверяем схожим образом, как и деление на 4.

Теперь переходим к проверке делимости на 11. Здесь начинается всё самое интересное. Нам нужно складывать и вычитать цифры из числа, но проблема в том, что мы работаем с переменными типа u32, а они могут хранить в себе лишь положительные числа, а если мы вычтем из первого числа второе, может получится отрицательное число. Чтобы это решить мы сначала сложим цифры, которые должны сложить (1, 3 и 5), далее сложим цифры, которые должны вычесть, а потом из большего вычитаем меньшее и проверяем делится ли число на 11. Если да, то всё число тоже делится на 11. В коде на leo это будет выглядеть так:

Нам остаётся лишь вернуть все 8 переменных с помощью return.

Наша программа готова! Полный код:

program delimost.aleo {
    transition main(a: u32) -> (bool, bool, bool, bool, bool, bool, bool, bool) {
        let del_2: bool = false;
        let del_3: bool = false;
        let del_5: bool = false;
        let del_9: bool = false;
        let del_10: bool = false;
        let del_4: bool = false;
        let del_25: bool = false;
        let del_11: bool = false;
        let n_5: u32 = a.rem(10u32);
        a = a/10u32;
        let n_4: u32 = a.rem(10u32);
        a = a/10u32;
        let n_3: u32 = a.rem(10u32);
        a = a/10u32;
        let n_2: u32 = a.rem(10u32);
        a = a/10u32;
        let n_1: u32 = a.rem(10u32);
        if n_5.rem(2u32) == 0u32 {
            del_2 = true;
        }
        if (n_5 + n_4 + n_3 + n_2 + n_1).rem(3u32) == 0u32 {
            del_3 = true;
        }
        if n_5 == 0u32 || n_5 == 5u32 {
            del_5 = true;
        }
        if (n_5 + n_4 + n_3 + n_2 + n_1).rem(9u32) == 0u32 {
            del_9 = true;
        }
        if n_5 == 0u32 {
            del_10 = true;
        }
        if (n_4*10u32 + n_5).rem(4u32) == 0u32 {
            del_4 = true;
        }
        if (n_4*10u32 + n_5).rem(25u32) == 0u32 {
            del_25 = true;
        }
        let sum_1: u32 = n_1 + n_3 + n_5;
        let sum_2: u32 =  n_2 + n_4;
        let del_11_help: u32 =  0u32;
        if sum_1 > sum_2 {
            del_11_help = sum_1 - sum_2;
        } else {
            del_11_help = sum_2 - sum_1;
        }
        if (del_11_help).rem(11u32) == 0u32 {
            del_25 = true;
        }
        return (del_2, del_3, del_5, del_9, del_10, del_4, del_25, del_11);
    }
}

Если вам была полезна данная статья, то подписывайтесь на мой профиль