Произведение цифр числа на Prolog

      Комментарии к записи Произведение цифр числа на Prolog отключены

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 2 года/лет, 3 мес. назад.

  • Автор
    Сообщения
  • #1976

    questioner
    Участник

    Нужна программа, вычисляющая произведение цифр данного натурального числа.

  • #1978

    Для решения задачи удобно написать вспомогательную функцию, которая корректно обработает случай, когда на вход подан ноль или отрицательное число. Случай с нулем подробно описан в теме про преобразование числа в список цифр, кстати вашу задачу можно решить выполнив такое преобразование, а затем вычислив произведение элементов списка.

    positive_product_digits(0, 1):-!.
    positive_product_digits(Number, Product):-
      Digit is Number mod 10,
      NextNumber is Number div 10,
      positive_product_digits(NextNumber, TailProduct),
      Product is TailProduct * Digit.
      
    product_digits(0, 0):-!.
    product_digits(Number, List):-
      Number < 0, !, positive_product_digits(-Number, List);
      positive_product_digits(Number, List).

    Цифры числа получаются последовательным делением числа и взятием остатка от деления на 10. Деление числа выполняется целочисленным (оператором div), а результат деления обрабатывается рекурсивно. Например, для числа 37 будет выполнена следующая последовательность шагов:

    1. число: 37, остаток от деления: 7 (цифра числа), результат целочисленного деления: 3 (обрабатывается рекурсивно);
    2. число: 37, остаток от деления: 3 (цифра числа), результат целочисленного деления: 0 (обрабатывается рекурсивно);
    3. число: 0, функция должна вернуть единицу, т.к. в изначальном числе нуля нет

    Однако, число может содержать ноль в конце — в этом случае функция должна обработать его. В связи с этим, правило выполняющее рекурсивную обработку цифр должно возвращать единицу при нулевом значении аргумента, а вспомогательное правило — обрабатывать такой вход как особый случай.

Для ответа в этой теме необходимо авторизоваться.