Найти все натуральные числа <= N, которые делятся без остатка на каждую из своих цифр - Lisp
Формулировка задачи:
Найти все натуральные числа <= N, которые делятся без остатка на каждую из своих цифр
Решение задачи: «Найти все натуральные числа <= N, которые делятся без остатка на каждую из своих цифр»
textual
Листинг программы
(defun int-digits (n) (loop for c across (write-to-string n) collect (digit-char-p c))) (defun digi-div (n) (remove-if-not #'(lambda (a &aux (w (int-digits a))) (and (notany #'zerop w) (loop for e in w always (zerop (mod a e))))) (loop for a from 1 to n collect a))) > (digi-div 129) (1 2 3 4 5 6 7 8 9 11 12 15 22 24 33 36 44 48 55 66 77 88 99 111 112 115 122 124 126 128)
Объяснение кода листинга программы
В коде реализованы две функции:
int-digits— принимает целое числоnи возвращает последовательность цифр этого числа. Цифры получаются путем перебора всех символов в строковом представлении числаn.digi-div— принимает целое числоnи возвращает последовательность чисел, которые делятся без остатка на каждую из своих цифр. Для этого используется функцияint-digits, которая возвращает последовательность цифр числа. Затем с помощью цикла и функцииzeropпроверяется, делится ли число на каждую из цифр без остатка. Если делится, то число добавляется в результат. Вот список описывающих переменные и их значения:n— целочисленная переменная, значение которой передается в функциюdigi-div.c— переменная-счетчик, используемая в цикле в функцииint-digits.a— переменная-счетчик, используемая в цикле во внешней функцииdigi-div.w— переменная-ассоциатив, используемая во внутренней функции вdigi-div. В ней хранятся цифры числаa.e— переменная-счетчик, используемая во внутреннем цикле во внутренней функции вdigi-div. В ней хранится текущая цифра числаa.digit-char-p— функция, проверяющая, является ли символ цифрой.remove-if-not— функция, удаляющая из последовательности все элементы, для которых выполняется указанное условие.#'(lambda (a &aux (w (int-digits a))) (and (notany #'zerop w) (loop for e in w always (zerop (mod a e))))) — лямбда-функция, используемая в функцииdigi-div` для фильтрации чисел, которые делятся без остатка на каждую из своих цифр.zerop— функция, проверяющая, равно ли число нулю.mod— функция, возвращающая остаток от деления числа на другое число.loop— цикл, используемый во внутренней функции вdigi-div.always— вспомогательная функция, используемая во внутреннем цикле во внутренней функции вdigi-div.collect— функция, собирающая все значения в последовательность.from 1 to n— диапазон чисел, который перебирается в цикле во внешней функцииdigi-div.129— значение переменнойn, которое передается в функциюdigi-div.(1 2 3 4 5 6 7 8 9 11 12 15 22 24 33 36 44 48 55 66 77 88 99 111 112 115 122 124 126 128)— результат работы функцииdigi-divдля числа129. Это последовательность чисел, которые делятся без остатка на каждую из своих цифр.