阶乘函数只能数到 12

Factorial function only counts to 12

此阶乘函数在 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 可以容纳的最大值:

#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 <= 0 这样的条件并不好。表示负数的阶乘永远为1,为假

是因为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;
}

函数的结果太大了。我认为 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 link: https://jsfiddle.net/8gxyj913/

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

可以使用 并放弃精度。

而是考虑 string approach.