Проверка числа на совершенное на Leo
Привет! Сегодня мы создадим функцию на языке программирования Leo от проекта Aleo, которая будет определять, является ли полученное число совершенным. Полную задачу вы можете изучить ниже:
Логика программы следующая: мы делаем перебор от 1 до значения переменной, проверяя, делится ли данное число без остатка на нашу переменную, если да, тогда мы суммируем делитель с остальными делителями числа. И далее проверяем, равна ли сумма делителей нашей переменной.
Давайте приступим и создадим новую программу через Aleo Studio:
У нас создалась базовая функция main, изменим в ней вход функции на одну переменную a типа u32, а на выходе функции переменная типа boolean (true, если число совершенное, иначе, false):
Теперь давайте создадим переменную, которая будет хранить сумму всех делителей, переменной а.
Следующим шагом создадим переменную result, она будет иметь тип bool и хранить в себе результат работы программы.
Теперь создаем цикл перебора, в идеале должен быть перебор от 1 до а, но leo это не поддерживает, поэтому просто берем число в рамках которого будет значение переменной a.
В условном выражении прописываем условие. С помощью оператора rem определяем, является ли итерация i делителем и также проверяем, чтобы мы не выходили за значение переменной a (при i > a делителей быть не может). И если i является делителем, тогда прибавляем i к переменной num
Теперь сравниваем num и a. Если они равны, тогда число совершенное и переменная result имеет значение true.
program soversh.aleo { transition main(a: u32) -> bool { let num: u32 = 0u32; let result: bool = false; for i: u32 in 1u32..100u32 { if a.rem(i) == 0u32 && i < a { num = num + i; } if num == a { result = true; } } return result; } }
Если же введем число 28, которое является совершенным получаем true: