求大数的阶乘

算法基本原理

用我们小学时用的计算两个数相乘列竖式再计算和的方法,用计算机模拟出相似的思路,用数组存储每一次的计算结果,并处理一些特殊情况,就可以了。

具体方法可参考我的其他文章:

C语言大数相乘

C语言大数相加


代码

#include<stdio.h>
#define N 500010
int a[N],b[5],c[N],d[N];
int len(int *w) {	//求数组有效长度的函数
	int x=0,i;
	for(i=0;i<N;i++) if(w[i]!=-1) x++;
	return x;
}
int main() {
	int i,j,k,v,u,al,bl=5,jc,jj,m,n,s=0;
	for(v=0;v<N;v++) a[v]=-1;//初始化数组
	a[0]=1;
	for(v=0;v<4;v++) b[v]=0;
	b[4]=1;
	printf("请输入正整数:"); 
	scanf("%d",&n);
	for(v=1;v<=n;v++) {
    	al=len(a);
    	for(i=0;i<al+bl;i++) c[i]=d[i]=0;//初始化中间数组 
    	for(i=bl-1;i>=0;i--){  
    	    k=al;
			jc=0;
			//核心部分
    	    for(j=al-1;j>=0;j--) {  
   	    	    c[k]=(a[j]*b[i]+jc)%10; //求得余数   
    		    jc=(a[j]*b[i]+jc)/10;   //进位   
   	    		if(j==0) c[k-1]=jc;
				k--;  
        	}
        	for(j=al+i,m=al;j>=i;j--,m--) {  
        	    if(d[j]+c[m]>=10) d[j-1]++;      //进位   
       	       	d[j]=(d[j]+c[m])%10;            //累加   
       	   	}
       	   	//核心部分
    	}
		for(i=0;i<al+bl;i++) a[i]=d[i];	//值传递给a数组 
		b[4]++;
		for(i=4;i>0;i--) { //乘数加一 
			if(b[i]==10) {
				b[i]=0;
				b[i-1]++;
			}
		}
	}
	printf("其阶乘为:"); 
	for(u=0;u<len(a)+5;u++) { 	//答案开头有0则跳过 
		if((a[u]==0&&s==0)||a[u]==-1) continue;
		s=1;
		printf("%d",a[u]);
	}
}


运行结果示例



猜你喜欢

转载自blog.csdn.net/littlewhitelv/article/details/80157558