階乘計算
問題描述
輸入一個正整數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;
}