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

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

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

Автобусные билеты нумеруются шестизначными числами от 000000 до 999999. Напишите программу, которая подсчитывает количество “счастливых” (сумма первых трёх цифр равна сумме трёх последних) билетов, не используя циклы с глубиной вложения больше трёх.
Листинг программы
  1. program schaste;
  2. var i,s,k,s1: integer;
  3. begin
  4. s:=0;k:=0;s1:=0;
  5. for i:=1 to 14 do
  6. begin
  7. k:=k+i;
  8. s1:=s1+(i-10)*3;
  9. if s1<0 then s1:=0;
  10. s:=s+sqr(k-s1);
  11. end;
  12. writeln (2*s);
  13. end.
Мой вариант:
Листинг программы
  1. (defun happy ()
  2. (setq s 0 k 0 s1 0)
  3. (iter (for i from 1 to 14)
  4. (setq k (+ k i) s1 (+ s1 (* (- i 10) 3)))
  5. (when (< s1 0)
  6. (setq s1 0 s (+ s (sqr (- k s1))))))
  7. (* 2 s ))
При вызове функции результат: 69.5981676126246. Не пойму в чем ошибка. Подскажите пожалуйста.

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

textual
Листинг программы
  1. (defun lucky ()
  2.   (let ((c 0))
  3.     (dotimes (tt 14 (+ c c))
  4.       (let ((ct 0))
  5.            (iter (for a from (max 0 (- tt 18)) to (min 9 tt))
  6.                  (summing (- (min 9 (- tt a)) (max 0 (- tt a 9)) -1) into ct))
  7.                  (setq c (+ c (* ct ct)))))))
  8.  
  9. ==> LUCKY
  10.  
  11. (lucky)
  12.  
  13. ==> 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут