Найти все натуральные числа <= 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
. Это последовательность чисел, которые делятся без остатка на каждую из своих цифр.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д