NYOJ 28 大数阶乘

大数阶乘

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 3
描述
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
输入
输入一个整数m(0
输出
输出m的阶乘,并在输出结束之后输入一个换行符
样例输入
50
样例输出
30414093201713378043612608166064768844377641568960512000000000000
来源
经典题目
上传者
张云聪
i = 2      j = 0      s = a[0] *2+c = 2     a[0] = 2     c = 0
i = 3      j = 0      s = a[0] *3+c = 6     a[0] = 6     c = 0
i = 4      j = 0      s = a[0]*6 +c = 24   a[0] = 4     c = 2
             j = 1      s = a[1]*4 +2 = 2     a[1] = 2     c = 0
i = 5      j = 0      s = a[0]*5 +0 = 20    a[0] = 0     c = 2
             j = 1      s = a[1]*5 +2 = 12    a[1] = 2    c = 1
             j = 2      s = a[2]*5 +1 = 1      a[2] = 1    c = 0
#include
#include
const int maxn = 20000;
int a[maxn];
int main(){
	int n, i, j, s, c;
	scanf("%d",&n);
	memset(a,0,sizeof(a));
	a[0] = 1;
	for(i = 2; i <= n; i++){  //大数 
		c = 0;
		for(j = 0; j <= maxn; j++){   //把大数阶乘的值储存起来 
			s = a[j] * i + c;   //我们很容易理解 例: 5 * 4 * 3 * 2 * 1 = 120,但是数容易越界。 
			a[j] = s % 10;   //要输出120,如何借用数组呢?先取模,输出个位,然后取余。 
			c = s / 10;     //所以我们直接在每个循环直接操作,避免数过大 
		}
	}
	for(j = maxn; j >= 0; j--){
		if(a[j] != 0){   //数组开始的时候初始化,要判断i=? 
			break;
		}
	}
	for(i = j; i >= 0; i--){  //输出n! 
		printf("%d",a[i]);
	}
	printf("\n");
	return 0;
} 

你可能感兴趣的:(大数问题)