HDU1042 N!陣列處理大數
阿新 • • 發佈:2018-11-08
***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; }