Составить список из цифр заданного числа в обратном порядке

      Комментарии к записи Составить список из цифр заданного числа в обратном порядке отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на списки Составить список из цифр заданного числа в обратном порядке

Помечено: ,

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

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

    questioner
    Участник

    Помогите решить задачу на Prolog:

    Составить список из цифр заданного числа в обратном порядке.

    Например,

    num_to_list(127645, List)
    List = [5,4,6,7,2,1]

  • #1958

    Алгоритм разложения числа на цифры заключается в последовательности шагов, каждый из которых:

    1. отделяет последнюю цифру числа за счет получения остатка от деления на 10;
    2. отбрасывает последнюю цифру числа (получает новое число) при помощи целочисленного деления на 10;
    3. рекурсивно обрабатывает число до тех пор, пока оно не равно нулю.

    positive_number_to_list(0, []):-!.
    positive_number_to_list(Number, [Digit|Tail]):-
      Digit is Number mod 10,
      NextNumber is Number div 10,
      positive_number_to_list(NextNumber, Tail).

    Приведенная функция корректно обработает любые целые положительные числа, в том числе, заканчивающиеся на ноль. Однако, если на вход будет подан ноль — функция вернет пустой список — это не корректно. Кроме того, функция не сработает для отрицательных чисел, т.к. например -22 mod 10 равно 8, а не 2. Самый простой способ решить эти проблемы — написать вспомогательную функцию, которая корректно обработает частные случаи — для нуля вернет список из одного элемента, а для отрицательного числа обработает модуль:

    number_to_list(0, [0]):-!.
    number_to_list(Number, List):-
      Number < 0, !, positive_number_to_list(-Number, List);
      positive_number_to_list(Number, List).

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