编程计算并输出1~50之间的所有数的阶乘(大数阶乘)

编程计算并输出1~50之间的所有数的阶乘(大数阶乘)_第1张图片
如果使用普通的方法,当阶乘计算到13!时数据就开始出现问题,因为int型数据无法保存这么大的数字,即使换成long ,long long ,double等也无法容纳,所以我们需要使用大数的方法来完成这道题目。

所谓大数就是将一个极大的数值拆分开来,每一位的数字都作为数组的一个元素保存起来,下面我将一步一步讲解这个代码如何实现
首先声明变量 a用于储存大数,数组大小可以赋予任意较大值,足够保存即可

	int jw,w=1,t,a[5000],i,j,z; 
	a[0] = 1 ;
//	Jw为进位 W为位数 a为大数储存 t储存临时数据 

我们可以将大数的每一位分别与一个数字相乘,得到一个临时数据,对该数据取余保留当前项,进位加到下一项,即可得到每一位的数值

	for(j=1,jw=0; j<=w; j++){
	 	t = a[j-1] * i + jw;	// 使被拆分为数组的大数的每一项与 i 相乘并且加上进位  
		a[j-1] = t % 10;		// 将余数存到当前项中 
			w = t / 10;   			//取进位 
	} 
		
	while( jw ){
		a[++w-1] = jw % 10;
		jw /= 10; 
	}

例子:
数据 9 *11
a[0] =9;
t = a[0]*9;
a[0] = t%10 = 9
a[1] = t/10 =9
当存在进位的时候,位数增加,并将进位%10后进到下一位中,若进位大于十,则循环一直往后加。

		for(z = w; z>=1; z--){
   		printf("%d",a[z-1]);
   	}

因为大数的数据在数组中为逆序排序,所以只需倒序遍历输出数组即可得到答案


完整代码:

#include
int main()
{
   int jw,w=1,t,a[5000]; 
   int i,j,z; 
//	Jw为进位 W为位数 a为大数储存 T储存临时数据 
   a[0] = 1;
   for(i=1; i<=50; i++){
    	for(j=1,jw=0; j<=w; j++){
    		t = a[j-1] * i + jw;	// 使被拆分为数组的大数的每一项与 i 相乘并且加上进位  
   		a[j-1] = t % 10;		// 将余数存到当前项中 
   		jw = t / 10;   			//取进位 
   	} 
   	
   	while( jw ){
   		a[++w-1] = jw % 10;
   		jw /= 10; 
   	}
   	//当有进位的时候将进位给到下一项		
   	for(z = w; z>=1; z--){
   		printf("%d",a[z-1]);
   	}
   	printf("\n");	
   	
   }
   return 0;
    
} 

编程计算并输出1~50之间的所有数的阶乘(大数阶乘)_第2张图片
计算结果如图

你可能感兴趣的:(编程计算并输出1~50之间的所有数的阶乘(大数阶乘))