藍橋杯基礎練習:階乘計算

                                                階乘計算

問題描述

  輸入一個正整數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; 
}




 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章