阶乘计算

问题描述

  输入一个正整数n,输出n!的值。
  其中n!=1*2*3*…*n。

算法描述

  n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
  首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。

输入格式

  输入包含一个正整数n,n< =1000。

输出格式

  输出n!的准确值。

样例输入

10

样例输出

3628800

解题思路:

大数相乘;

程序代码:

#include<stdio.h>
#include<string.h>
int a[1010][10010],len[1010];
void get_num(int x)
{
	int i,j,y;
	int a1[10010],a2[10010],at[10010];
	memset(at,0,sizeof(at));
	j=0;y=x;
	for(i=len[x-1]-1;i>=0;i--)
		a1[j++]=a[x-1][i];
	j=0;
	while(y)
	{
		a2[j++]=y%10;
		y/=10;
	}
	len[x]=j;
	for(i=0;i<len[x];i++)
		for(j=0;j<len[x-1];j++)
			at[i+j]+=a2[i]*a1[j];
	for(i=0;i<10010;i++)
	{
		if(at[i]>=10)
		{
			at[i+1]+=at[i]/10;
			at[i]%=10;
		}
	}
	len[x]=10010;
	for(i=10009;i>=0;i--)
		if(at[i]==0)
			len[x]--;
		else
			break;
	j=0;
	for(i=len[x]-1;i>=0;i--)
		a[x][j++]=at[i];
}
int main()
{
	int n,i,j;
	scanf("%d",&n);
	a[1][0]=1;len[1]=1;
	a[2][0]=2;len[2]=1;
	for(i=3;i<=n;i++)
		get_num(i);
	for(i=0;i<len[n];i++)
		printf("%d",a[n][i]);
	printf("\n");
	return 0; 
}