回复 13# 的帖子
谢谢13# 的提醒
这是修改后的
#include<stdio.h>
#define Length 2000
int a[Length];
int ExitsNum();
void LoadArray()//初始话数组
{
int i1;
for(i1=1;i1<=Length;i1++)//循环当前数组所有长度
{
a[i1]=0;//组全部初始化为0
}
}
void CatchNum(int p)//数组进位
{
int temp;//用于临时存储个位以上的数值
temp=a[p]/10;//将所得的2位以上的数值保存在temp中
a[p]=a[p]%10;
while(temp!=0)//判断temp里是否存有两位数以上的数,如果有放入p+1位上去
{
p++;//将数组下标后移一位
a[p]=a[p]+temp%10;//再取改变后的temp的个位的值
temp=temp/10;//temp里是否存有两位数以上的数 有继续while 没有退出
}
}
void multi(int k)//对传入的k做乘法
{
int i;//阶乘计算
int q=0;//用于判断有效位
int l=0;//用于有效位数 (分别对数组每个元素做乘法)
for(i=1;i<=k;i++)
{
q=ExitsNum();//取得数组长度
for(l=0;l<q;l++)//对数组每个元素做乘法
a[l]=a[l]*i;//先对数组每个元素做乘法
for(l=0;l<q;l++)
CatchNum(l);//再对数组每个元素分别进位
}
}
int ExitsNum()//判断有效位
{
int i,temp;
int k=0;//保存数值为0的数组长度值
i=Length;//
while( a[i] ==0 )//遇到不为0的数组元素 时退出循环
{
k++;
i--;
}
return Length-k+1;//返回长度值
}
void print()//对数组的数据进行 输出
注:此处为逆向输出
{
int i=0,j;//判断有效位
i=ExitsNum();//取得有效位
for(j=i;j>=0;j--)//逆向输出
{
printf("%d",a[j]);//输出最后数据
}
}
void main()
{
int n;
while(1)
{
a[0]=1;//初始化第一个数 为1 (为什么? 因为零乘任何数都为零)
LoadArray();//对数组初始化
printf("请输入你要计算的阶乘数:");
scanf("%d",&n);
multi(n);//计算
printf("得到的数据为:");
print();//打印出数据
printf("\n");
printf("数据长度为:%d",ExitsNum());
printf("\n");
}
}