该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
/********************************************************************************
** 文件名:fac.c
**文件功能:计算大数的阶乘,最大可计算20000.
**文件作者:
**文件日期:
********************************************************************************/
#include
#include
#include
int factorial(int n,int a[]);//计算大数阶乘函数
int printfactor(int k,int a[]);//显示大数阶乘值
int main(int argc,char *argv[])
{
int *pNum;//指向运算的数组空间
int k=0;//存储数组有效位数
int n;//要计算的阶乘数
int m;
printf("Please input a non-negative number.\n");
scanf("%d",&n);
if(n<0) {
printf("input data is error.\n");
return -1;
}
pNum=(int *)malloc(n*sizeof(int));
if(pNum==NULL)
{
printf("Failed to apply for memory\n");
return -1;
}
memset(pNum,0,n*sizeof(int));
k=factorial(n,pNum);
m=printfactor(k,pNum);
printf("\nThe valid units:%d\n",m);
free(pNum);
pNum=NULL;
return 0;
}
/********************************************************************************
**函数名:factorial(int n,int a[],int size);
**函数功能:函数用大数组模拟日常十进制运算过程,计算大数阶乘值,值存入a[]指向
** 的内存空间,使用每个int型空间存储四位十进制数,每位空间最大存储9999.
**函数参数:1.n要计算的阶乘数2.a[]指向运算存储的数组
**函数返回:函数返回运算结果数据的有效位数。
**其他说明:用户应自己申请数组空间,其大小应足够存储运算后的数据。(>=n*4字节)
********************************************************************************/
int factorial(int n,int a[])
{
int i;
int carry;//保存
int temp;//临时变量
int m;//运算有效位数
if(n<0||a==NULL)
{
printf("Input data is error.\n");
return -1;
}
carry=0;
a[0]=n;
n--;
m=0;
while(n>1)
{
for(i=0;i<=m;i++)
{
temp=a[i];
temp=temp*n;
temp+=carry;
carry=temp/10000;
temp=temp%10000;
a[i]=temp;
if(carry>0&&i==m)
{
m++;
a[m]+=carry;
carry=0;
break;
}
}
n--;
}
return m;
}
/********************************************************************************
**函数名:printfactor(int k,int a[]);
**函数功能:打印大数阶乘运算结果数据
**函数参数:1.k要输出数组的有效数据2.a[]指向运算存储的数组
**函数返回:函数返回打印的有效位数。
********************************************************************************/
int printfactor(int k,int a[])
{
int i;
int m=0;
m=printf("%d",a[k--]);
for(i=k;i>=0;i--)
m+=printf("%.4d",a[i]);
return m;
}