NYOJ 28.大数阶乘(大数问题)

/*描述
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
输入
输入一个整数m(0 输出
输出m的阶乘,并在输出结束之后输入一个换行符
样例输入
50
样例输出

30414093201713378043612608166064768844377641568960512000000000000

*/

对于大数问题,我们要有将大数与数组结合的思想,可以利用类似于人工的方法求出有关大数的问题。

对于大数阶乘来说,最重要的是如何将每个数的每位数与相对应的数组元素储存起来,就如算50的阶乘,我们要先从1开始乘:

1*2=2,将2存到a[0]中,

2*3=6,将6储存在a[0]中,

6*4=24,是两位数,那么24%10==4存到a[0]中,24/10==2存到a[1]中,

24*5=120,是三位数,那么120%10==0存到a[0]中,120/10%10==2存到a[1]中,120/100==1存到a[2]中,

120*6=720,那么720%10==0存到a[0]中,720/10%10==2存到a[1]中,720/100==7存到a[2]中,

...................

直到乘到50,将每一位数储存为止。

#include 
int main()
{
	int carry,n,j;
	int a[40001];//储存阶乘的每一位数
	int digit;//表示阶乘的位数
	int temp,i;   
	scanf("%d",&n);
	a[0]=1;
	digit=1;
	for(i=2; i<=n; i++)
	{
		for(carry=0,j=1; j<=digit; ++j)
		{
			temp=a[j-1]*i+carry;
			a[j-1]=temp%10;
			carry=temp/10;
		}
		while(carry)
		{
			a[++digit-1]=carry%10;
			carry/=10;
		}
	} 
	for(int k=digit; k>=1; --k)//倒序输出每一位数
		printf("%d",a[k-1]);
	printf("\n");
    return 0;
}






/*
#include 
#include 
#define MAX 20000
int main()
{
	int arr[MAX]; 
	memset(arr,0,sizeof(arr));
	arr[0] = 1;
	int i,j,m,s;
	scanf("%d",&m);
	for(i=2;i<=m;i++)
	{
		int t = 0;
		for(j=0;j=0;i--)//把0都筛掉 
	{
		if(arr[i]) break;
	}
	for(j=i;j>=0;j--)//倒着输出 
	{
		printf("%d",arr[j]);
	}
	printf("\n");
	return 0;
}
*/


你可能感兴趣的:(大数运算)