【问题标题】:Big Integer Problem While Dealing With Factorials处理阶乘时的大整数问题
【发布时间】: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 longunsigned long long 会让你走得更远,但是阶乘会呈指数增长,所以即使你这样做了,你也会很快遇到限制。
  • @DastyDustleg 弄清楚! printf(sizeof(long long int));
  • 您是否尝试以这种方式计算阶乘的某些属性?我想知道您将如何使用更高精度的结果,以及是否有另一种不需要增加精度的方法来实现您的目标。例如,我遇到过诸如“阶乘有多少尾随零?”之类的问题,在这种情况下,您无需实际计算阶乘即可得到答案。
  • 我怀疑你的 40 阶乘结果是否正确。如果您的 long long 是 64 位,那么您将不会接近 40 阶乘。你可能只是得到一些垃圾值,可能是结果的低位。

标签: c math integer


【解决方案1】:

问题是你溢出了变量,这意味着sizeof(variable)字节被保留来存储数字,但是数字需要比保留的更多的字节。

uint32_t 为您提供 0 到 2^32=4,294,967,296 的范围,因此您将无法(正确)存储数字 5000000000,与任何其他整数类型相同。

有一些选择:

价格是除了第一个(根据情况,第二个)一个,所有选项都会增加CPU消耗。

【讨论】:

    猜你喜欢
    • 2016-01-04
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多