【问题标题】:Factorial function only counts to 12阶乘函数只数到 12
【发布时间】:2020-09-15 14:29:54
【问题描述】:

这个阶乘函数从 13 及以上开始给出错误的结果。我不知道为什么。

#include <stdio.h>

int fatorial (int p);

int main() {
    int x = 13;
    int test = fatorial(x);
    printf("%d", test);
}  

int fatorial (int p) {
    if (p <= 0)
        return 1;
    else
        return p*fatorial(p-1);
}

对于 x = 0, 1, 2 ...12 它会打印正确的结果,但对于 13!它打印 1932053504 这是不正确的。 例如,对于 x=20,它会打印 -210213273。

我知道这不是进行阶乘的最佳方法。这是我的作业,它必须是这样的。

【问题讨论】:

  • 结果对于int类型来说太大了。
  • 尝试使用unsigned long long int 而不是int,你会得到更多正确的阶乘。
  • 您的代码中发生int溢出,您可以尝试打印INT_MAX来检查整数的限制。您可以尝试使用 unsigned long long int 以获得对 int 的最高支持

标签: c algorithm factorial integer-overflow


【解决方案1】:

如果您尝试这样做,您将获得int 可以保持的最大值:

#include <stdio.h>
#include <limits.h>
int main(void) 
{
    printf("%d\n", INT_MAX);
}

您的代码导致溢出。

如果你使用更大的类型,你可以得到更多的数字,但不是很多。你可以使用这个:

unsigned long long fatorial (unsigned long long p) {
    if (p <= 0)
        return 1;
    else
        return p*fatorial(p-1);
}

但它不会让你走得太远。如果您想要更大,您需要找到一个更大整数的库或创建一些自定义解决方案。一个这样的库是 https://gmplib.org/,但这可能超出了你的作业范围。

顺便说一句,p &lt;= 0 这样的条件并不好。表示负数的阶乘始终为1,为假。

【讨论】:

    【解决方案2】:

    因为在12之后,任何数的阶乘结果都超过了int的大小。

    你可以试试下面的代码:

    #include<stdio.h>
    int main()
    {
        int a[100],n,counter,temp,i;
        a[0]=1;
        counter=0;
        printf("Enter the number: ");
        scanf("%d",&n);
        for(; n>=2; n--)
        {
            temp=0;
            for(i=0; i<=counter; i++)
            {
                temp=(a[i]*n)+temp;
                a[i]=temp%10;
                temp=temp/10;
            }
            while(temp>0)
            {
                a[++counter]=temp%10;
                temp=temp/10;
            }
        }
        for(i=counter; i>=0; i--)
            printf("%d",a[i]);
        return 0;
    }
    

    【讨论】:

    • 如果你在第 5 行看到我已经初始化了 a[0] = 1 的值,所以当第一次在 (a[i]*n)+temp 中使用 a[i] 时,i = 0a[0] = 1 的值我在开始时声明的。
    【解决方案3】:

    函数的结果太大。我认为 big int 会更好地满足您的目的。 Big int 允许您拥有更大的数字。另外,这也是我会做的。

    int x = the number you want to factorialize
    int ans = 1;
    (Then instead of all of those functions)
    for(var i = x; i > 0; i--) {
    ans = ans*i;
    }
    

    System.out.println(ans);

    Javascript 链接:https://jsfiddle.net/8gxyj913/

    【讨论】:

    • 嗯,那是javascript?
    • 我完全不知所措,试图想象为什么有人会赞成这个“答案”:这个问题是关于 C 的,不是关于 Java 的,当然也不是关于 Javascript 的。 C中没有“大整数”,问题清楚地表明解决方案(算法)的形式是由于他们的作业限制。因此,这个答案对OP来说毫无价值,对其他C同学一点帮助也没有。
    • @cmaster-reinstatemonica 我同意。不幸的是,这个答案绝对没有帮助
    【解决方案4】:

    I need to get to 100!

    100!约为 9.332622e+157。仅使用标准整数类型是不够的。 32 位 int 好到 12!。使用 64 位整数数学,代码可以达到 21 左右!

    可以使用floating point math 并放弃精度。

    改为考虑string approach

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 2021-01-17
      • 2018-12-26
      • 1970-01-01
      • 2022-06-24
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多