抱歉,我觉得问这个问题很愚蠢,我准备失去一半的分数,但为什么这个算法不起作用?它在一定程度上起作用。在数字 13 之后,阶乘有点偏离。例如,数字在数十万位及以后并不完全匹配。
#include <stdio.h>
float factorial(unsigned int i) {
if (i <= 1) {
return 1;
}
return i * factorial(i - 1);
}
int main() {
int i = 13;
printf("Factorial of %d is %f\n", i, factorial(i));
return 0;
}
这是输出:
Factorial of 13 is 6227020800.000000
这是一个不准确输出的例子:
Factorial of 14 is 87178289152.000000
数字 14 的输出实际上应该是这样的(来自 mathisfun.com)
14 87,178,291,200
我将返回类型更改为 float 以获得更准确的输出,但大部分代码是从此处获得的:https://www.tutorialspoint.com/cprogramming/c_recursion.htm
编辑:如果我将返回类型更改为加倍,则输出精确到 21。我正在为 %Lf 中的输出使用字符串格式化程序em>printf 函数。
最佳答案
简单。 float
无法在不损失精度的情况下准确存储大于 16777216 的整数。
int
优于 float。但是试试 long long
这样你就可以正确地存储 19 位数字了。
关于c - 为什么这个阶乘算法不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41510473/