c语言大数阶乘0有几位,大数阶乘C语言,可计算20000!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

/********************************************************************************

** 文件名: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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值