PTA_基礎程式設計題目集_6-10 階乘計算升級版 (20 分)“大數階乘”
阿新 • • 發佈:2018-12-17
- 題目地址
- 題目分析:
1.預估1000!的位數~~進行放大估計~~1000^900&100^100即是3*900+2*100+o<3000位;
2.這裡顯然需要利用陣列來儲存數字並進行運算,讓陣列成員每個儲存3位數字(題目條件已告知引數小於1000),我們構建1200個成員的陣列(3600位);
3.難點在於我們對陣列成員間相乘、進位的考慮,這裡容易誤入歧途;這裡本質上來講,與就是把十進位制轉化為千進位制,而轉化為千進位制的一個重要原因在於我們將多位數*多位數的複雜情況轉化為了單位數*多位數的簡單情況進行運算,具體細節見下面程式碼。
- 我的程式碼
void Print_Factorial(const int N) { int n = N; if (n < 0) printf("%s", "Invalid input"); if (n == 0 || n == 1) printf("%d", 1); /* 數字運算時: 該演算法通過陣列控制,使得每次都進行 同位數*同位數 (可以小,不能大)運算, 且將 大數乘法 -> 個位*多位。 同位數*同位數=本位數+進位數: (在 個位*多位 的情況下) 進位數+進階本位數 < 進位值(一個簡單的乘法規律) 從而不產生多次相加的連續進位問題 */ if (n > 1) { int a[1200] = { 1,0 }, len = 1;//一個數組,一個位數指標len for (int c, j; n > 1; n--)//這裡的進階c設計的非常巧妙 { for (j = 0, c = 0; j < len; j++)//通過j讓多位的每位被乘 { int p = a[j] * n + c; a[j] = p % 1000; c = p / 1000; } c > 0 ? a[j] = c, len++ : 0;//一次單位*多位的最後一次c的運算 } printf("%d", a[len - 1]);//注意列印格式的規範化 for (int m = len - 2; m >= 0; m--) printf("%03d", a[m]); } }