Найти все натуральные числа <= 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)

Объяснение кода листинга программы

В коде реализованы две функции:

  1. int-digits — принимает целое число n и возвращает последовательность цифр этого числа. Цифры получаются путем перебора всех символов в строковом представлении числа n.
  2. digi-div — принимает целое число n и возвращает последовательность чисел, которые делятся без остатка на каждую из своих цифр. Для этого используется функция int-digits, которая возвращает последовательность цифр числа. Затем с помощью цикла и функции zerop проверяется, делится ли число на каждую из цифр без остатка. Если делится, то число добавляется в результат. Вот список описывающих переменные и их значения:
  3. n — целочисленная переменная, значение которой передается в функцию digi-div.
  4. c — переменная-счетчик, используемая в цикле в функции int-digits.
  5. a — переменная-счетчик, используемая в цикле во внешней функции digi-div.
  6. w — переменная-ассоциатив, используемая во внутренней функции в digi-div. В ней хранятся цифры числа a.
  7. e — переменная-счетчик, используемая во внутреннем цикле во внутренней функции в digi-div. В ней хранится текущая цифра числа a.
  8. digit-char-p — функция, проверяющая, является ли символ цифрой.
  9. remove-if-not — функция, удаляющая из последовательности все элементы, для которых выполняется указанное условие.
  10. #'(lambda (a &aux (w (int-digits a))) (and (notany #'zerop w) (loop for e in w always (zerop (mod a e))))) — лямбда-функция, используемая в функцииdigi-div` для фильтрации чисел, которые делятся без остатка на каждую из своих цифр.
  11. zerop — функция, проверяющая, равно ли число нулю.
  12. mod — функция, возвращающая остаток от деления числа на другое число.
  13. loop — цикл, используемый во внутренней функции в digi-div.
  14. always — вспомогательная функция, используемая во внутреннем цикле во внутренней функции в digi-div.
  15. collect — функция, собирающая все значения в последовательность.
  16. from 1 to n — диапазон чисел, который перебирается в цикле во внешней функции digi-div.
  17. 129 — значение переменной n, которое передается в функцию digi-div.
  18. (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. Это последовательность чисел, которые делятся без остатка на каждую из своих цифр.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы