递归法求n!的问题,为什么我写的程序到13以后计算结果就不对了

#include<stdio.h>
int main()
{
int s=1,i,n;
printf("请输入一个数:\n");
scanf("%d",&n);
int a=n;
if(n==0||n==1)
s=1;
while(n>1)
{
s=s*n;
n--;
}
printf("%d!=%d",a,s);
return 0;
}

img


请问一下为什么到13以后计算出来的结果就不对了

因为会爆int,int类型最大2147483647

超过了c的最大整形范围

溢出了

仅供参考:

#include<stdio.h>
#define N 1000    //要计算的N
long s[N]={1,1},n=N,t=2,a=1,b=0;
int main()//雨中飞燕之作
{
    for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&&b)?(*s)++:0)
        s[a]=(b+=s[a]*t)%10000,b/=10000;
    for(printf("%d",s[*s]);--*s>0;) printf("%04d",s[*s]);
    return 0;
}