#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-разрядном компьютере / ОС). В этих системах максимальное значение, которое вы можете получить из along
, составляет чуть более 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.