//f52.c --- @CopyLeft by tsaiwn@csie.nctu.edu.tw #include #define N 52 /*** Factorial (1) to Factorial(52) ***/ /*** @CopyLeft by tsaiwn@csie.nctu.edu.tw */ char d[88]={0}; // 全部放 0; /* d[0] 是個位, d[1] 是十位, ... d[87] 在最左邊! */ // d[87] d[86] d[85] ... d[2] d[1] d[0 ] 共有 88 位 int msd=0; /* Most Significant Digit, 最左非 0 的那位在哪位? */ // 記住最左位以便算到該位就可, 不用算到最左邊 void mult(int); // 學人做乘法 int main( ) { int i, k, c; /* c is used for carry and tmp value */ d[0] = 1; /* put one in right most digit as the initial value */ printf("%2d!=%d\n", 0, 1); // 0! = 1 for(i=1; i<=N; ++i) { mult(i); // 乘上 i printf("%2d!=", i); // 印出 i 階乘 = 然後下列印出由左而右印出 d[ ] for(k = msd; k >= 0; --k) printf("%d", d[k]); // 有記住最左位的好處是直接印 :-) printf("\n"); /* newline */ } return 0; } void mult(int i) { // data in Global variable char d[ ]; int k, c = 0; /* initial carry is 0 一開始進位當然是 0, 右邊會進位到左邊 */ for(k=0; k<= msd; ++k) { // 學人做乘法, 由最右邊個位數往左乘過去 c = d[k]*i + c; /* 借用一下 c 當臨時和 */ d[k] = c % 10; /* 放回餘數 */ c /= 10; /* 進位carry to next digit */ } /* up to msd */ while(c) { /* 最後(最左)一位乘上去仍可能有進位 */ d[++msd] = c % 10; /* one more digit, 多了一位. 注意 ++msd 寫法 */ c /= 10; /* 例若最後一位為9, 則 9*52 = 468 為三位數 */ } } /****** C:\TESTC>tcc f52.c Turbo C++ Version 3.00 Copyright (c) 1992 Borland International f52.c: Turbo Link Version 5.0 Copyright (c) 1992 Borland International Available memory 4110344 C:\TESTC>f52 0!=1 1!=1 2!=2 3!=6 4!=24 5!=120 6!=720 7!=5040 8!=40320 ... 50!=30414093201713378043612608166064768844377641568960512000000000000 51!=1551118753287382280224243016469303211063259720016986112000000000000 52!=80658175170943878571660636856403766975289505440883277824000000000000 C:\TESTC>f52 *******/