14. Факториалы.
Условие:
Составить словарь, где ключ - это целое число (от 1 до 30 включительно), а значение - это факториал этого числа
1! = 1
2! = 1×2
5! = 1×2×3×4×5
10! = 1×2×3×...×9×10 = 9!×10
Программа спрашивает у пользователя число, и выводит его факториал. Это повторяется до тех пор, пока пользователь не ввёл -1. Причём:
• Если факториал этого числа уже как-то ранее вычислялся, то программа берёт готовое число.
• Если нет, то программа считает его от ближайшего ранее вычисленного факториала.
Нужно свести к минимуму количество операций умножения. Пример:
Пользователь ввёл 5:
> Считаем факториал 5, попутно вычисляя факториалы 4, 3 и 2. Все значения сохраняем в кэше.
Пользователь ввёл 3:
> Такой факториал мы только что сосчитали, пока считали факториал пяти, берём готовое значение из кэша.
Пользователь ввёл 7
> Такой факториал мы не считали, но знаем факториал 5. Поэтому считаем его как 5! * 6 * 7.
Код:
result_dict = {1:1} # этот словарь будем дополнять готовыми результатами, стартует уже с минимальными данными для цифры 1
number = int(input("Введите число:") )
while number > 0: # в цикле будет спрашивать о новом числе, пока не введёшь отрицательное число
if number in result_dict.keys():
print("Для числа", number, "факториал равен", result_dict[number])
elif number not in result_dict.keys():
work_range = range((max(result_dict.keys()) + 1), number + 1) # создание range, кот. будем обходить в цикле
composition = result_dict[max(result_dict.keys())] # вынимаем максимальное значение из существующего словаря
for i in work_range: # обойдём в цикле все числа в range
composition *= i # считаем новое произведение факториала
result_dict[i] = composition # создаём ключ в словаре со значением переменной "composition"
print("Для числа", number, "факториал равен", result_dict[number])
number = int(input("Введите число:"))