C语言数组100000,100000!阶乘,应该可以更大

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

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

** 文件名:fac.c

**文件功能:计算大数的阶乘,最大可计算20000.

**文件作者:

**文件日期:

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

#include

#include

#include

#define N 10000

#define M (sizeof(int)*4)

int factorial(int n,int a[],int size);//计算大数阶乘函数

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*M);

if(pNum==NULL)

{

printf("Failed to apply for memory\n");

return -1;

}

memset(pNum,0,n*M);

k=factorial(n,pNum,n*M);

if(k==-1) return -1;

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[]指向运算存储的数组

** 3.size数组的大小

**函数返回:函数返回运算结果数据的有效位数。

**运算式:an,n0,n1均为四位数整数,1式X2式

**|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|

**|--1--|-----|-----|--0--|--a8-|--a7-|--a6-|--a5-|--a4-|--a3-|--a2-|--a1-|--a0-|-----|

**|--2--|--X--|-----|-----|-----|-----|-----|-----|-----|-----|-----|--n1-|--n0-|-----|

**|-----|-----|--0--|--0--|a8.n0|a7.n0|a6.n0|a5.n0|a4.n0|a3.n0|a2.n0|a1.n0|ao.n0|-----|

**|-----|-----|-----|a8.n1|a7.n1|a6.n1|a5.n1|a4.n1|a3.n1|a2.n1|a1.n1|ao.n1|-----|-----|

**

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

int factorial(int n,int a[],int size)

{

int i,j;

int k,c=0;

int t,t1,t2=0;

int b1,b0;

int head,tail;

if(n<0||a==NULL) return -1;

head=tail=0;

a[0]=1;

for(i=2;i<=n;i++)

{

b1=i/N;

b0=i%N;

while(a[tail]==0)

tail++;

for(j=tail;j<=head;j++)

{

k=a[j];

t1=k*b0;

t=t1%N+t2%N+c;

c=t1/N+t2/N+t/N;

t2=k*b1;

a[j]=t%N;

if(j==head&&(c>0||t2>0))

{

head++;

}

if(head>=size)

{

printf("数组空间不够!\n");

return -1;

}

}

}

return head;

}

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

**函数名:printfactor(int k,int a[]);

**函数功能:函数用大数组模拟人们日常十进制运算过程,计算大数阶乘值,值存入a[]指向

** 的内存空间,使用每个int型空间存储四位十进制数,每位空间最大存储9999.

**函数参数:1.n要计算的阶乘数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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值