正常情況下階乘指從1乘以2乘以3乘以4一直乘到所要求的數,即自然數n階乘。
下面使用int來計算階乘結果,代碼如下:
int SmallFactorial(int number){ int sum = 1; for (int i = 1; i <= number; i++) { sum *= i; } return sum;}
測試結果:
當階乘很小的時候,很正常沒有問題。
這裡32!超出int範圍,結果就出錯了。
隨著階乘中的自然數n越來越大,1000!,10000!這樣的階乘無法通過簡單的類型來儲存,不過可以通過數組來類比大數。
下面使用數組來實現:
//計算階乘數的位元int length = (int)(number * Math.Log10((number + 1) / 2));//儲存結果的數組int[] dashu = new int[length];dashu[length - 1] = 1;;//迴圈for (int i = 2; i <= number; i++){ //數組中的數乘以i for (int j = length - 1; j >= 0; j--) { if (dashu[j] == 0) { continue; } dashu[j] = dashu[j] * i; } //處理數組的數,當大於10就向上進位 for (int j = length - 1; j > 0; j--) { if (dashu[j] == 0) { continue; } dashu[j - 1] += dashu[j] / 10; dashu[j] = dashu[j] % 10; }}//轉換結果foreach (int i in dashu){ if (i == 0 && sb.Length == 0) continue; sb.Append(i.ToString());}
100! 結果如下:
1000! 結果如下:
數已經是很大了。
不過這裡的計算沒有進行最佳化,不過應付普通的計算足夠了。
10000!我這裡測試需要將近6s,而100000!則網頁已無法顯示,計算時間太長逾時了。
從計算階乘中,我們瞭解了如何去處理大數的一種方法。