大数阶乘,有趣

一、我们都知道int类型存储不了12以后的阶乘,在c语言里。而double类型,会存在很大的误差。所以我们可以考虑用数组来存储大数阶乘。(你也可以直接看代码,里面我也写了很清楚的注释

二、阶乘,大家都很明白。

1!==1;

2!==1*2;

3!==1*2*3;

4!==1*2*3*4;

5!==1*2*3*4*5;

Firstly,a[0]直接赋值,为1的阶乘。不然for循环不好处理;现在a[0]为1,为一位数;

一直到3!都为一位数,我们就按照一位数来存。即,a[0]*2==2!,a[0]*3==3!

Secondly,当4!时,有两位数了,现在a[0]里是6,即a[0]*4==4!(4*6==24)。我们如何将4取出来存在a[0]中呢,24%10==4即可。但此时,多出一位数,我们便把它存在a[1]中。a[1]里我们要存数字2,如何得到数字2呢,24/10==2即可,后面的位数以此类推。

说实话,我思维不好,所以也是看了半天才看明白,所以在这里直接给大家上代码,哈哈哈哈哈

#include<stdio.h>
int main()
{
	int i, n, j;
	int digit = 1;//位数的计数器,我们需要知道存在数组里时,有多少位数
	int num = 0;//数学乘法里进位数,如:12*6,个位为2,进位数为1;
	int temp = 0;//每一位数相乘后的结果,如:上面个位相乘后为12,则temp=12;
	int a[20001] = { 0 };//可以存200001个数字,已经很大了
	a[0] = 1;//a【0】,也就是1的阶乘,需要自己赋值,不然不好存
	scanf("%d", &n);
	for (i = 2; i <= n; i++)//这个控制算数字的阶乘,i为几,即算的是几的阶乘
	{
         num=0;
		for (j = 0; j < digit; j++)//这个for循环,则是控制每一位数的存储。
		{
			temp = a[j] * i + num;
			a[j] = temp % 10;
			num = temp / 10;
		}
		while (num)//当然,num==0时,不需要进位;
		{
			a[digit] = num%10;//由于上面for循环里,位数没有包括当前位数,所以在这里存储,当num为两位数时,我们只要十位上的数字存在这里
			num = num / 10;//退出循环
			digit++;//既然进了循环,则表明位数多了一位,则加1;
		}
	}
	for (i = digit-1; i >=0; i--)//因为我们存的数是和原来的数相反的,所以倒序输出,就OK了
	{
		printf("%d", a[i]);
	}
	printf("n");
	
	return 0;
}

谢谢。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>