hdoj 1042 N!(還是對大數的處理)
阿新 • • 發佈:2019-01-22
初略估計10000!的階乘會有將近3000位數。
用二維陣列每個單元儲存一位數最後會記憶體溢位,所以我們每個單元儲存4位數,減少陣列的大小。
注意輸出時的細節,每個單元儲存4位數,如果數是0的話,要以%04輸出。
#include<stdio.h> using namespace std; #define M 10001 #define N 10001 int a[N][M]={0}; int len[N]; void change() { int i,j,l,r,temp;l=1; a[0][0]=1;len[0]=1; for(i=1;i<N;i++) { for(j=0;j<l;j++) { a[i][j]=a[i-1][j]*i; }r=0; for(j=0;j<l;j++) { temp=a[i][j]+r; a[i][j]=temp%10000; r=temp/10000; } while(r) { a[i][l++]=r%10000; r=r/10000; } len[i]=l; } } int main() { int n,i; change(); while(~scanf("%d",&n)) { if(len[n]==1) printf("%d\n",a[n][0]); else{ printf("%d",a[n][len[n]-1]); for(i=len[n]-2;i>=0;i--) printf("%04d",a[n][i]); printf("\n"); } } return 0; }