Редакция для Факториал
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
Автор:
1. Идея
Нужно вычислить факториал числа n, то есть произведение всех целых чисел от 1 до n.
Например:
1! = 12! = 1 * 2 = 23! = 1 * 2 * 3 = 65! = 1 * 2 * 3 * 4 * 5 = 120
По условию также важно помнить, что 0! = 1.
Самый прямой способ — завести переменную-накопитель ans, сначала равную 1, и по очереди умножать её на все числа от 1 до n.
2. Наблюдения
- Факториал определяется как произведение подряд идущих чисел от
1доn. - Если
n = 0, цикл от1до0просто не выполнится ни разу, аansостанется равным1. Это как раз и даёт правильный ответ. - Ограничение
0 <= n <= 20подобрано так, чтобы результат помещался в типlong longв C++. - Никаких сложных методов здесь не требуется: достаточно обычного цикла.
3. Алгоритм
- Считать число
n. - Создать переменную
ansи присвоить ей1. - Для каждого
iот1доn:- умножить
ansнаi.
- умножить
- Вывести
ans.
4. Почему это работает
После начала работы ans = 1.
Дальше цикл последовательно делает:
- после умножения на
1:ans = 1 - после умножения на
2:ans = 1 * 2 - после умножения на
3:ans = 1 * 2 * 3 - ...
- после умножения на
n:ans = 1 * 2 * 3 * ... * n
Именно это произведение по определению и равно n!.
Если n = 0, произведение чисел от 1 до 0 не содержит множителей, поэтому по определению результат равен 1. В программе это получается автоматически: цикл не выполняется, и ans остаётся равным 1.
5. Сложность
Цикл выполняется n раз, поэтому:
- время работы:
O(n) - дополнительная память:
O(1)
6. Код на C++17
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
long long ans = 1;
for (int i = 1; i <= n; i++) {
ans *= i;
}
cout << ans << '\n';
return 0;
}
7. Код на Python 3
n = int(input())
ans = 1
for i in range(1, n + 1):
ans *= i
print(ans)
Комментарии