Нужно вычислить n! = 1·2·3·…·n (0! = 1) в uint64. Главное — не вернуть
молча мусор при переполнении: если результат не помещается в uint64, верните
ошибку ErrOverflow.
var ErrOverflow = errors.New("factorial overflow")
// Factorial возвращает n! или ErrOverflow, если результат не влезает в uint64.
func Factorial(n uint64) (uint64, error)
Примеры
Factorial(0) → 1, nil
Factorial(5) → 120, nil
Factorial(20) → 2432902008176640000, nil
Factorial(21) → 0, ErrOverflow // 21! > 2⁶⁴−1
Factorial(50) → 0, ErrOverflow
Ограничения
- Тип аргумента —
uint64 (отрицательных не бывает, обрабатывать их не нужно).
20! — последний факториал, помещающийся в uint64; 21! уже нет.
- Проверять переполнение нужно до того, как оно произошло: полагаться на
«результат стал меньше предыдущего» — ненадёжно.
Устно: как проверить переполнение умножения a·b в беззнаковых числах, не
имея типа шире? Что меняется, если нужно считать факториалы больших чисел
точно?
Разбор и эталонное решение — после своей попытки: на собеседовании подсказок не будет.
Сначала попробуй сам — подсказки не дают готовый ответ.