【发布时间】:2020-07-28 11:33:10
【问题描述】:
以下代码有一个我无法解决的问题:
#include <stdio.h>
#include <stdlib.h>
int factorial(long long int x) {
long long int temp;
temp = x - 1;
for (; temp > 0; temp--) {
x = x * temp;
}
return x;
}
int main() {
long long int x, fact;
while (1) {
printf("Please enter the number that you want to learn factoriel...\n(To quit press ctrl+c)\n");
scanf("%lld", &x);
if (x == EOF) {
break;
}
if (x >= 0) {
fact = factorial(x);
printf("Factorial of %lld is %lld\n", x, fact);
} else {
fact = 0;
printf("Factorial of %lld is %lld\n", x, fact);
}
}
printf("The Program has successfully terminated...\n");
return 0;
}
首先,它一直工作到 17 岁,但在 17 岁时,它给了我一堆负数,结果是几个数字,结果给了我 0
我该如何解决这个问题?
【问题讨论】:
-
您已达到内置类型的限制。它不能容纳那么大的数字。如果您在网上搜索,很容易找到支持“更大”数字的库 - 实际上是没有限制的库。或者,您可以编写自己的特殊类型 - 例如,将结果保存在 1000
long long unsigned的数组中 - 或者更好地保存在long long unsigned的可变长度数组中。 -
@DastyDustleg 如果返回类型是
int,那么您不妨在任何地方使用int代替long long。像现在这样混合它们是没有意义的。int是链条中最薄弱的环节。使用long long或unsigned long long会让你走得更远,但是阶乘会呈指数增长,所以即使你这样做了,你也会很快遇到限制。 -
@DastyDustleg 弄清楚! printf(sizeof(long long int));
-
您是否尝试以这种方式计算阶乘的某些属性?我想知道您将如何使用更高精度的结果,以及是否有另一种不需要增加精度的方法来实现您的目标。例如,我遇到过诸如“阶乘有多少尾随零?”之类的问题,在这种情况下,您无需实际计算阶乘即可得到答案。
-
我怀疑你的 40 阶乘结果是否正确。如果您的
long long是 64 位,那么您将不会接近 40 阶乘。你可能只是得到一些垃圾值,可能是结果的低位。