Признаки делимости на 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); } }
Если вам была полезна данная статья, то подписывайтесь на мой профиль