大数阶乘

对于大数来说,一个数的阶乘是非常大的,同样,一个int类型的整数,他的阶乘就有可能会很大。

就拿50来说,他的阶乘位数是65位,就已经远远超过了long long int类型的最大值。这时候,我们要通过字符串的方法,来进行阶乘的运算。

将大数与数组结合

对于大数阶乘来说,最重要的是如何将每个数的每位数与相对应的数组元素储存起来,就如算50的阶乘,我们要先从1开始乘:

1*2=2,将2存到a[0]中,

接下来是用a[0]*3;

    2*3=6,将6储存在a[0]中,

接下来是用a[0]*4;

    6*4=24,是两位数,那么24%10==4存到a[0]中,24/10==2存到a[1]中,

接下来是用a[0]*5;a[1]*5+num(如果前一位相乘结果位数是两位数,那么num就等于十位上的那个数字;如果是一位数,num==0)

    24*5=120,是三位数,那么120%10==0存到a[0]中,120/10%10==2存到a[1]中,120/100==1存到a[2]中,

接下来是用a[0]*3;a[1]*6+num;a[2]*6+num;

    120*6=720,那么720%10==0存到a[0]中,720/10%10==2存到a[1]中,720/100==7存到a[2]中,

...................

直到乘到50,将每一位数储存为止。


#include <stdio.h>
int main()
{
	int digit , temp , n , i , j;//digit = 位数 , temp 各位相乘后的数  
	int a[20001];
	a[0] = 1;
	digit = 1; // 初始位数为一 , 个位 
	scanf("%d" , &n);
	for(i = 2 ; i < n ; i++)//i 从2 开始 
	{
		int num = 0 ;//num 用来表示每次进位的数 
		for(j = 0 ; j < digit ; j++)
		{
			temp = a[j] * i + num;// 由这里可知为什么a[0] = 1  。 不同位上的数都要乘以 i , 每乘一次都要进行一次分配 与 进位 
			a[j] = temp % 10;
			num = temp / 10; 
		}
		while(num) // 如果上面循环完  , num 的值还不为0 则 表示最后一位需要进位 
		{
			a[digit] = num % 10;
			num = num / 10;
			digit++;
		 } 
	 } 
	 for(i = digit - 1 ; i >= 0 ; i--)//存数时 是 自1 ~ digit 存 , 因此反着输出 
	 {
	 	printf("%d" , a[i]);
	 }
	 printf("\n");
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值