Решил перевести код с Pascal на Lisp. Алгоритм подсчета счастливых билетов
Формулировка задачи:
Автобусные билеты нумеруются шестизначными числами от 000000 до 999999. Напишите программу, которая подсчитывает количество “счастливых” (сумма первых трёх цифр равна сумме трёх последних) билетов, не используя циклы с глубиной вложения больше трёх.
Мой вариант:
При вызове функции результат: 69.5981676126246. Не пойму в чем ошибка. Подскажите пожалуйста.
program schaste; var i,s,k,s1: integer; begin s:=0;k:=0;s1:=0; for i:=1 to 14 do begin k:=k+i; s1:=s1+(i-10)*3; if s1<0 then s1:=0; s:=s+sqr(k-s1); end; writeln (2*s); end.
(defun happy () (setq s 0 k 0 s1 0) (iter (for i from 1 to 14) (setq k (+ k i) s1 (+ s1 (* (- i 10) 3))) (when (< s1 0) (setq s1 0 s (+ s (sqr (- k s1)))))) (* 2 s ))
Решение задачи: «Решил перевести код с Pascal на Lisp. Алгоритм подсчета счастливых билетов»
textual
Листинг программы
(defun lucky () (let ((c 0)) (dotimes (tt 14 (+ c c)) (let ((ct 0)) (iter (for a from (max 0 (- tt 18)) to (min 9 tt)) (summing (- (min 9 (- tt a)) (max 0 (- tt a 9)) -1) into ct)) (setq c (+ c (* ct ct))))))) ==> LUCKY (lucky) ==> 55252
Объяснение кода листинга программы
В коде определена функция lucky, которая вычисляет число счастливых билетов. Функция использует два вложенных цикла. Первый цикл выполняется 14 раз, при этом значение переменной c увеличивается на c каждый раз. Второй цикл выполняется для каждого значения a от (max 0 (- tt 18)) до (min 9 tt). Для каждого значения a происходит вычисление выражения (- (min 9 (- tt a)) (max 0 (- tt a 9))) и результат сохраняется в переменной ct. Затем значение c увеличивается на сумму значений ct и ct. В итоге, после выполнения всех итераций, функция возвращает значение c. В данном случае, результатом выполнения функции будет число 55252.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д