NYOJ 28 大数阶乘



大数阶乘

时间限制: 3000  ms  |  内存限制: 65535  KB
难度: 3
描述
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
输入
输入一个整数m(0<m<=5000)
输出
输出m的阶乘,并在输出结束之后输入一个换行符
样例输入
50
样例输出
30414093201713378043612608166064768844377641568960512000000000000
来源
经典题目
上传者
张云聪


用数组逆序保存阶乘结果,5000的阶乘在计算器上算不出来,但位数不会超过30000。两层for循环,外层是从2到m,里层进行对每个数的大数乘法运算。输出时排除前导0,逆序输出即阶乘结果。

代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int a[30000];
int main()
{
	int m;
	scanf("%d",&m);
	memset(a,0,sizeof(a));
	a[0] = 1;
	for(int i = 2;i <= m;i++)
	{
		int c = 0;	
		for(int j = 0;j < 30000;j++)
		{
			int s = a[j] * i + c;
			a[j] = s % 10;
			c = s / 10;
		}
	}
	int flag = 0;
	for(int j = 30000 - 1;j >= 0;j--)
	{
		
		if(a[j] != 0)
			flag = 1;
		if(flag)
			printf("%d",a[j]);
	}
	printf("\n");
	return 0;
} 


你可能感兴趣的:(大数乘法)