阶乘计算
问题描述
输入一个正整数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;
}