Я написал простой код на 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))
Вы можете объяснить?
спасибо за ваш быстрый ответ, но что я могу использовать для слишком больших целых чисел?
unsigned long long intИспользуйте long long [ширина 64 бита] вместо int [ширина 32 бита]. Кроме того, (например) printf("%lld\n",num); вместо printf("%d\n",num);
unsigned long long был бы лучшим вариантом, но имейте в виду, что он также ограничен и не сможет хранить значения после ~fact(20).
Также обратите внимание, что ваша версия Python работает для n от 0, но ваши версии C и javascript работают только до 1, потому что они проверяют n == 1 вместо n == 0. n == 0 предпочтительнее, так как это позволяет вашей функции работать со всеми неотрицательными целыми числами (до тех пор, пока она не переполнится). (0! хорошо определен, и его значение равно 1)
@CristiFati, тогда факт (21) дает неправильный результат, что мы должны использовать, чтобы это исправить?





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