求较大整数n的阶乘,因为n较大时,n的阶乘超出了正常类型的表示范围,可以采用数组进行操作(c实现)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求较大整数n的阶乘,因为n较大时,n的阶乘超出了正常类型的表示范围,可以采用数组进行操作(c实现)相关的知识,希望对你有一定的参考价值。

下面链接是java的实现,思路叫清晰点

http://blog.51cto.com/6631065/2044441

#include <stdio.h>

void Print_Factorial ( const int N );

int main() {
	int N;

	scanf("%d", &N);
	Print_Factorial(N);


	return 0;
}

void Print_Factorial(const int N) {
	#define MAX 5000

	int a[MAX]= {0},tmpA[MAX]= {0},b[4]= {0};
	int k,i,flag,j,temp,bit,l;

	int f1=0,f2=0,f3=0;
	/* 如果小于0大于1000直接返回输入错误*/
	if(N <0 || N >1000) {
		printf("Invalid input\n");
		return;
	}
	/*等于0输出1*/
	else if(N == 0) {
		printf("%d\n",1);
		return ;
	}
	/*大于0小于1000*/
	else {


		/*将数组a的第一位赋值为1,其余赋值为零*/
		a[0] =1;




	
		for(i=1; i<=N; i++) {

			b[0]=b[1]=b[2]=b[3]=0;

			flag =i;
			/*将N的各位数进行分解,放入数组b中*/
			k=0;
			while(flag > 0 && k<4) {
				b[k] = flag %10;
				flag = flag /10;
				k++;
			}


			temp =0;
			bit =0;

			for(j=0; j<4; j++) {
				/*使用tmpA存储的数值与b数组相乘,结果存到a数组中*/
				for(l=0; l<MAX; l++) {
					temp = a[l] *b[j];


					tmpA[l+j]+= temp;


				}
			}


			for(k=0; k<MAX-1; k++) {
				if(tmpA[k]>=10) {
					temp = tmpA[k];
					tmpA[k] = tmpA[k] %10;
					tmpA[k+1] = tmpA[k+1]+temp/10;

				}
			}
			for(k=0; k<MAX; k++) {
				a[k] =	tmpA[k];
				tmpA[k] =0;
			}

		}



	}


	printf("\n");
	f3=0;
	for(k=MAX-1; k>=0; k--) {
		if(a[k] >0) f3=1;
		if(f3>0)printf("%d",a[k]);

	}
}


下面链接是java的实现,思路叫清晰点

http://blog.51cto.com/6631065/2044441


以上是关于求较大整数n的阶乘,因为n较大时,n的阶乘超出了正常类型的表示范围,可以采用数组进行操作(c实现)的主要内容,如果未能解决你的问题,请参考以下文章

C语言,dev cpp,编写的计算阶乘程序,数值较大时输出不正确,求助.

无限循环计算阶乘问题

matlab阶乘和程序

Python整数阶乘组合计算

100的阶乘末尾有多少个零!急求程序!

求N的阶乘末尾有几个0