Различные результаты факториального расчета в C, Python и JavaScript

Я написал простой код на Python, JavaScript и C. Я обнаружил, что результаты Python и JavaScript одинаковы, но C дает мне другой неверный результат, и я не могу понять, в чем ошибка.

C-код:

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

int main(void){
    printf("%i \n",fact(13));
}

JS-код:

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

console.info(fact(13));

Код Python:

def fact(n):
    if (n == 0):
        return 1
    else:
        return n * fact(n - 1)

print(fact(13))

Вы можете объяснить?

Никогда не занимался C, но готов поспорить, что желаемый результат 6227020800 просто слишком велик вписываться в int

CertainPerformance 28.05.2019 01:53

спасибо за ваш быстрый ответ, но что я могу использовать для слишком больших целых чисел?

Kevin Omar 28.05.2019 01:57
en.wikipedia.org/wiki/C_data_types заставляет меня задуматься, может быть unsigned long long int
CertainPerformance 28.05.2019 01:59

Используйте long long [ширина 64 бита] вместо int [ширина 32 бита]. Кроме того, (например) printf("%lld\n",num); вместо printf("%d\n",num);

Craig Estey 28.05.2019 02:01
unsigned long long был бы лучшим вариантом, но имейте в виду, что он также ограничен и не сможет хранить значения после ~fact(20).
CristiFati 28.05.2019 02:05

Также обратите внимание, что ваша версия Python работает для n от 0, но ваши версии C и javascript работают только до 1, потому что они проверяют n == 1 вместо n == 0. n == 0 предпочтительнее, так как это позволяет вашей функции работать со всеми неотрицательными целыми числами (до тех пор, пока она не переполнится). (0! хорошо определен, и его значение равно 1)

Tom Karzes 28.05.2019 02:47

@CristiFati, тогда факт (21) дает неправильный результат, что мы должны использовать, чтобы это исправить?

Kevin Omar 31.05.2019 00:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Будучи интерпретируемыми языками, они (вероятно) автоматически выбирают тип данных для переменных в соответствии с размером данных.

Однако в C вы указали, что нужно использовать "int", а он слишком мал, чтобы вместить 13!

Если вы переключите "int" на "unsigned long long int" (да, используйте «long» дважды), то ваша программа будет возвращать правильные результаты в течение более длительного времени, пока снова не произойдет сбой — превышение размера 64-бит.

Другие вопросы по теме