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

在这里插入图片描述
如果使用普通的方法,当阶乘计算到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<stdio.h>
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;
    
} 

在这里插入图片描述
计算结果如图

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌桓丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值