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;
}

猜你喜欢

转载自blog.csdn.net/qq_41755258/article/details/83119585