1. 程式人生 > >HDU1042 N!陣列處理大數

HDU1042 N!陣列處理大數

***a[i][]表示的是i!,每一個a[i][j]存放一個小於10000。  

***用w[i]跟隨記錄數的長度。

***10000!是一個35660位數

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define inf 0x3f3f3f3f
int a[10002][9000];
int w[10002];//用來記錄位數 
//35660		
void f()	
{			
	a[0][1]=1;a[1][1]=1;a[2][1]=2;a[3][1]=6;
	w[0]=1;w[1]=1;w[2]=1;w[3]=1;
	int i,j;
	int mod=10000;//每一位數存放一個四位數 
	for(i=4;i<=10000;i++){
		int temp=0;
		for(j=1;j<=w[i-1];j++){
			temp+=a[i-1][j]*i;
			a[i][j]=temp%mod;
			temp/=mod;
		}
		a[i][j]=temp;
		//處理之後,第i個數的最後一位可能還是=>10000的數
		while(a[i][j]>=10000)
		{
			a[i][j+1]=a[i][j]/10000;
			a[i][j]=a[i][j]%10000;
			j++;
		}	
		if(0==a[i][j])	w[i]=j-1;
		else			w[i]=j;
	}		
} 

int main()
{
	f();
	int n;
	while(1==scanf("%d",&n))
	{
		int i,j;
		int len=w[n];
		printf("%d",a[n][len]);
		for(i=len-1;i>0;i--){
			printf("%04d",a[n][i]);
		}
		cout << endl;
	}
	return 0;
}