c语言如何求10000的阶乘,怎么用malloc函数计算10000的阶乘

满意答案

02ae427d08e371d7e90d5b995e828d6d.png

红魔7欧文

2013.07.02

02ae427d08e371d7e90d5b995e828d6d.png

采纳率:45%    等级:12

已帮助:3012人

哈哈,我刚刚写了一个精确计算阶乘的程序,下面是截图:只不过我用的是静态数组,可以精确到100万位,但我还没有测试过阶乘100万位的数字是多少,因为这太耗时间了。按照你的要求,只需要将静态数组改为动态的就行了。因我的代码是BCB的,可能不适合你。下面的代码是我回答XX计算5!+10!+15!+....100!的C版,你要适当改一下(注释应试比较清楚了)://由于使用了很大数组,内存消耗特大,静态数组直接占用栈空间,请在IDE中将Max stack size设为最大0x01000000

//也可以采用动态数组

#define MaxDigitCount 1024000

char ValBuf[MaxDigitCount+2];//存放n!结果值,1位数占一个字节,且颠倒存放,第1位为个位,第2位为十位...,这样便于向后进位

char TmpBuf[MaxDigitCount+2]; //存放中间结果

char SumBuf[MaxDigitCount+2];//求和结果//---------------------------------------------------------------------------

void fact(int n){

register i,j,k,m;

char nstr[100];

register char *p1,*p2,*p3,*pStart,*pEnd;

memset(ValBuf,0,sizeof(ValBuf));

ValBuf[0]='1';//乘数先置1

while(n>1){

sprintf(nstr,"%d",n--);

pStart=nstr;

pEnd=pStart+strlen(nstr)-1;

p1=pEnd ;

memset(TmpBuf,0,sizeof(TmpBuf));

m=0;

while(p1>=pStart){//被乘数从末位开始乘

i=*p1-'0';

p2=ValBuf;

p3=TmpBuf+m++;

k=0;

while(*p2){

j=*p2-'0';//字符还原成数值

j*=i;//乘

j+=k;//加上进位数

if(*p3)j+=*p3-'0';//加上本位数

*p3=j%10+'0';//数值转存为字符

k=j/10; //进位值 p2++;

p3++;

}

while(k){//进位

if(p3>=TmpBuf+sizeof(TmpBuf)-2){

printf("数据溢出!");

break;

}

if(*p3)k+=*p3-'0';

*p3++=k%10+'0';

k/=10;

}

p1--;

}

memcpy(ValBuf,TmpBuf,p3-TmpBuf);//将中间结果复制到乘数

}

}void GetSum(){//将ValBuf加到SumBuf

register i,k;

register char *p1,*p2;

if(!SumBuf[0])strcpy(SumBuf,ValBuf);

else{

p1=SumBuf;p2=ValBuf;

k=0;

while(*p2){

i=*p1;

if(i)i-='0';

i+=*p2-'0'+k;

*p1=i%10+'0';

k=i/10;// 进位

p1++;p2++;

}

while(k){//考虑进位

if(p1>=SumBuf+sizeof(SumBuf)-2){

printf("数据溢出!");

break;

}

if(*p1)k+=*p1-'0';

*p1++=k%10+'0';

k/=10;

}

}}void printRuslt(){ //将结果颠倒输出

register char *p1=SumBuf;

register int count=0,Zero=0,NotZero=0;

while(*p1){ //统计末尾0的个数

count++;

if(*p1=='0'&&!NotZero)

Zero++;

else NotZero=1;

p1++;

}

if(count)p1--;

printf("结果为:\n");

do{

printf("%c",*p1--);

}while(p1>=SumBuf); printf("\n共%d位,末尾有%d个0",count,Zero);}int move(int num,int m){

char s1[20],s2[20];

int i,len;

sprintf(s1,"%d",num);

len=strlen(s1);

for(i=0;i

if(i

s2[i]=s1[i+len-m];

}else

s2[i]=s1[i-m];

}

s2[i]='\0';

return num=atof(s2);

}

void main(int argc, char* argv[])

{

int n;

printf("%d\n",move(12345,2));

memset(SumBuf,0,sizeof(SumBuf));

for(n=5;n<=10;n+=5){

fact(n);

GetSum();

}

printRuslt();

fgetchar();

}

00分享举报

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值