阶乘代码问题

时间:2018-07-02 08:25:51

标签: c math

这是我的查找阶乘的代码。当我试图找到大于50的阶乘时,第一个代码在输出中给出错误。

#include<stdio.h>
short int t,i;
int count=0;
int num[100];
long long int fac = 1;
main()
{
scanf("%d",&t);
for(count=0;count<t;count++)
    {
        scanf("%d",&num[count]);
    }
for(count=0;count<t;count++)    
{
    int k= num[count];
    fac =1;
    for(i=1;i<=k;i++)
    {
        fac *= i;
    }    
    printf("%lld\n",fac);
}    
}

但是下面的代码可以正常工作。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    long T,N,i,j,digits,rem,x,a[200];
    scanf("%ld",&T);
    while(T--){
        scanf("%ld",&N);
        a[0]=1;
        digits=1;
        rem=0;
        for(i=1;i<=N;i++){
        for(j=0;j<digits;j++){
            x=a[j]*i+rem;
            a[j]=x%10;
            rem=x/10;
        }

        while(rem){
            a[digits]=rem%10;
            rem/=10;
            digits++;
        }
        }
        for(i=digits-1;i>=0;i--)
        printf("%ld",a[i]);
        printf("\n");
    }
}

无论使用long long int为何在第一个代码中都会发生这种情况,而在第二个代码中这只是long类型,但仍然可以正常工作!有人可以解释吗?

1 个答案:

答案 0 :(得分:2)

第二个代码段的聪明作者正在推出他们自己的方法来处理非常大的数字,例如50!。就像一个多精度库和阶乘算法合为一体。

第一个代码段没有这样的考虑。甚至21!也会溢出带符号的64位整数类型,结果不确定。