当所求的数是很大时,它的阶乘往往 int 和 long 这些数都无法保存,这是我们可以引用数组保存很大数的一位,比如 23 就用数组来表示, a[1]=2,a[0]=3, 这是数组的每一位相乘就和我们当时小学乘法一样,一个数乘以另一个数是,就用这个数的每一位乘以另一个数,再加上前一位的进位,这样就可以保证不会溢出,得到正确的结果。
# include<stdio.h>
# include<string.h>
int main(){
int a[100001];// 用于存放阶乘结果的数组
memset(a,0,sizeof(a));
int n;//n 的阶乘
int i,j,temp;
int carry;// 存放每一位相乘后得到的进位
a[0]=1;// 初始化结果的长度,这一位存放数组的长度
while(scanf("%d",&n)!=EOF)
{
a[1]=1;// 初始化这个数为 1
int digit=1;// 记录数组的长度 刚开始将这两句放到了循环体的外面,导致了错误的结果,因为每经过一个循环之后,这两个数是不确定的,应该将它们重新初始化,哦哦。。。。气死我了居然错这里了
// 外层循环用于控制计算 n 的阶乘,从 2 开始到 n ,和数组的每一位相乘
for(i=2;i<=n;i++)
{
for(carry=0,j=1;j<=digit;j++)
{
temp=a[j]*i+carry;
a[j]=temp%10;//a[j] 用来存放大于 9 的数的个位,例如这里相乘得到 45 则存放 5
carry=temp/10;// 存放进位, 45 这里就存的是 4
}
// 当这里 carry 不为 0 时,则说明在原先的最高上又有了进位
while(carry)
{
a[++digit]=carry%10;
carry=carry/10;// 看还有没有进位了
}
}
for(i=digit;i>0;i--)
{
printf("%d",a[i]);
}
printf(“/n”);// 注意这里的的换行,如果不加这一句,程序不会出现自动换行,则会出现格式错误,直接晕死
}
return 0;
}