nyoj 大數階乘 28
阿新 • • 發佈:2019-01-29
#include<stdio.h> #include<string.h> int a[3270];//其實我先開的很大,後來通過a[0]的值判斷,然後改的小了,儘量佔得空間少一點 int main() { int n; while(~scanf("%d",&n)) { a[1]=1; //初始化 a[0]=1; //用於儲存陣列進到幾位,為後面的輸出帶來極大便利 int up; for(int i=2; i<=n; ++i) { up=0;//判斷陣列是否進位 for(int j=1; j<=a[0]; ++j) //各個位相乘 { a[j] *=i; a[j] +=up; up=a[j]/100000;//可以將其看成100000進位制,不用開很大的陣列,效率上也得到了很大提升 a[j] %=100000;//這個比十進位制要好 } if(up!=0)//判斷是否進位 { a[0]++; a[a[0]]=up;//從這可以看出a[0]是儲存陣列位數 } } if(a[0]==1) printf("%d",a[1]);//如果沒超出5位數 直接輸出a[1] else { printf("%d",a[a[0]]);//防止前導0,因為要從後往前輸出,每個需要輸出5位,最高位不需要有0 for(int i=a[0]-1; i>0; i--) printf("%05d",a[i]);//這個需要輸出0 } puts(""); } }