Решил перевести код с Pascal на Lisp. Алгоритм подсчета счастливых билетов
Формулировка задачи:
- 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. Алгоритм подсчета счастливых билетов»
- (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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д