采用int数组存储每一位,模拟乘法操作,逐位相乘,往前进位。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
/***
函数:计算i!的值
**/
void Cal(int i,int big[50])
{
int j,up,res,m;
int ge,shi;//乘数的个位,十位
int big1[50],big2[50];
if(i==1)
{
big[0]=1;
}
else if(i<=9)
{
j=0;
up=0;
while(big[j]!=-1)
{
res = big[j]*i+up;
big[j] = res%10;
up = res/10;
j++;
}
if(up!=0)
big[j] = up;
}
else
{
ge = i%10;
shi = i/10;
//*****计算被乘数与十位数的乘积,存到big1[50]里
for(m=0;m<50;m++)
{
big1[m]=big[m];//十位数字的乘积
}
j=0;
up=0;
while(big1[j]!=-1)
{
res = big1[j]*shi+up;
big1[j] = res%10;
up = res/10;
j++;
}
if(up!=0)
big1[j] = up;
while(big1[j]==-1)
j--;
while(j>=0)
{
big1[j+1]=big1[j];
j--;
}
big1[0]=0;
//*****计算被乘数与个位数的乘积
if(ge!=0)//个位数不为零
{
for(m=0;m<50;m++)
{
big2[m]=big[m];//big2[50]存放个位数字的乘积
}
j=0;
up=0;
while(big2[j]!=-1)
{
res = big2[j]*ge+up;
big2[j] = res%10;
up = res/10;
j++;
}
if(up!=0)
big2[j] = up;
//将big1[50]与big2[50]逐位相加
up=0;
for(m=0;m<50;m++)
{
if(big1[m]!=-1 && big2[m]!=-1)//都没到最高位
{
big[m]=(big1[m]+big2[m]+up)%10;
up = (big1[m]+big2[m]+up)/10;
}
else if(big1[m]==-1 && big2[m]==-1)//都是还未使用的位
{
if(up!=0)
{
big[m]=up;
up = 0;
}
else
big[m]=-1;
}
else if(big1[m]!=-1 && big2[m]==-1)//一个是最高位,一个不是
{
big[m]=(big1[m]+0+up)%10;
up = (big1[m]+0+up)/10;
}
}
}
else//个位数为零,直接将big1[50]赋给原数组
{
for(m=0;m<50;m++)
{
big[m]=big1[m];
}
}
}
}
int main()
{
int big[50],i,j;
for(i=0;i<50;i++)
{
big[i]=-1;
}
for(i=1;i<=40;i++)
{
Cal(i,big);
printf("%d!=",i);
j=0;
while(big[j]!=-1)
{
j++;
}
j--;
while(j>=0){
printf("%d",big[j]);
j--;
}
printf("\n");
}
return 0;
}