Решил перевести код с Pascal на Lisp. Алгоритм подсчета счастливых билетов

Узнай цену своей работы

Формулировка задачи:

Автобусные билеты нумеруются шестизначными числами от 000000 до 999999. Напишите программу, которая подсчитывает количество “счастливых” (сумма первых трёх цифр равна сумме трёх последних) билетов, не используя циклы с глубиной вложения больше трёх.
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 ))
При вызове функции результат: 69.5981676126246. Не пойму в чем ошибка. Подскажите пожалуйста.

Решение задачи: «Решил перевести код с 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.

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


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

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

6   голосов , оценка 4.5 из 5