Факториал больших чисел с использованием рекурсии в C

#c #recursion

#c #рекурсия

Вопрос:

факториальная программа с использованием рекурсии на C:

 long fact(int n)
{
    if (n == 1)
       return 1;
    else
    {
       return n*fact(n - 1);
    }
}
  

Программа отлично работает с числами до 12.
Но для чисел, превышающих это, факт дает неверное значение.

Диапазон long достаточен для таких чисел, тогда в чем причина того, что факториал не вычисляется для чисел, превышающих 12?

Комментарии:

1. Добавьте в свою программу #include <limits.h> и printf("max:%ldn", LONG_MAX); , что должно объяснить это.

2. но возвращаемый тип — long rite?

3. Как вы печатаете длинные ?

4. Не все системы имеют 64-разрядный long тип данных (даже на 64-разрядном компьютере / ОС). В этих системах максимальное значение, которое вы можете получить из a long , составляет чуть более 2 миллиардов. Все, что превышает этот предел, приводит к переполнению.

5. @Houssni Помимо того, что редактирование слишком незначительно, редактирование кода в соответствии с вашими личными предпочтениями в стиле кодирования недопустимо. Стиль кодирования субъективен, и нет очевидного правильного или неправильного. Вы должны редактировать код только для исправления отступов и тому подобного, где отступов нет.

Ответ №1:

Диапазон long достаточен для таких чисел

Нет, это не всегда так. long гарантируется, что он должен быть не менее 32 бит, но значение 13! равно 6227020800 или 0x17328CC00 , которое не может храниться в 32-битном целом числе.

Попробуйте использовать long long вместо этого.

Комментарии:

1. long long корректно работает со спецификатором формата %llu или %lld

2. @mch да, я это мгновенно. Невозможно выйти за рамки этого

3. @Ross Конечно, это возможно… используйте числовой тип «multiprecision», например, с библиотекой mp GNU.