
"""
Сформувати функцію для переведення натурального числа з десяткової системи числення у шістнадцятирічну.

Виконав Іваненко Андрій Вадимович
"""


""" У даному випадку для визначення функції доцільніше використати ітерації ніж рекурсію, оскільки функція визначена 
через рекурсію витрачає більше часу та займає більше пам'яті за функцію визначену через ітерації. """


def to_hexadecimal1(num):  # Функція для переведення заданого числа у шістнадцятирічну систему числення (через ітерації)
    """ a - змінна, що буде зберігати у собі значення заданого числа у шістнадцятирічній системі числення.
    digits - рядок, що зберігає у собі всі цифри шістнадцятирічної системи числення. """
    a, digits = [], "0123456789ABCDEF"

    """ Поки задане число більше або дорівнює 16, то воно буде цілочисельно ділитись на 16, 
    а значення остач від ділення у шістнадцятирічній системі будуть додаватись до змінної a. """
    while num >= 16:
        a.append(digits[num % 16])
        num //= 16

    a.append(digits[num % 16])  # Знаходження останньої цифри числа у шістнадцятирічній системі
    a.reverse()  # Перевертання значення змінної a
    return "".join(a)  # Об'єднання цифр числа, що зберігаються у змінній a, у рядок


def to_hexadecimal2(num):  # Функція для переведення заданого числа у шістнадцятирічну систему числення (через рекурсію)
    digits = "0123456789ABCDEF"  # digits - рядок, що зберігає у собі всі цифри шістнадцятирічної системи числення
    # Якщо задане число менше за 16, то повертається остача від ділення його на 16 у шістнадцятирічній системі
    if num < 16:
        return digits[num % 16]
    else:
        """ В іншому випадку повертається конкатенація значення функції to_hexadecimal від частки заданого числа на 16 
        та частки від ділення заданого числа на 16 у шістнадцятирічній системі. """
        return to_hexadecimal2(num // 16) + to_hexadecimal2(num % 16)


answer = '1'
while answer == '1':

    while True:  # Введення натурального числа n, яке буде переводитись у шістнадцятирічну систему числення
        try:
            n = int(input("Введіть натуральне число:"))
            if n > 0:
                break
            else:
                print("Вводьте правильні дані!")
        except ValueError:
            print("Вводьте правильні дані!")

    print(f"Це число у шістнадцятирічній системі числення (визначине через ітерації) дорівнює: {to_hexadecimal1(n)}.\n"
          f"Це число у шістнадцятирічній системі числення (визначине через рекурсію) дорівнює: {to_hexadecimal2(n)}.")

    answer = input("Введіть '1' для повторення:")
