大数阶乘,C语言,数组

Posted 志大牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数阶乘,C语言,数组相关的知识,希望对你有一定的参考价值。

一、我们都知道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;

谢谢。

以上是关于大数阶乘,C语言,数组的主要内容,如果未能解决你的问题,请参考以下文章

高精度问题,C语言,求二的n次方

大数阶乘

大数阶乘(100!)

大数阶乘问题

非递归的o(n)的求n个数里面第k大数的算法

求编个java程序要求:编写一个求大数的阶乘,不能用biginteger,并且使用数组不能浪费,不