一個朋友問我一個問題100!利用C語言怎么實現。我很當然的寫了以下的代碼:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i; int N=0; int factorial = 1; printf("請輸入你要的求的階乘數N\n"); scanf("%d", &N); for (i = 1; i <= N; i++) { factorial = factorial*i; } printf("%d!=%d",N,factorial); system("pause"); return 0; }
我輸入小數時,結果是沒有問題的,但是當我計算100!的時候,發現100!居然是0.這個時候我意識到是不是100!超過我設置的數據類型的范圍。但是我發現在C語言中並沒有一個數據類型可以容納100!
上網查詢,我發現可以使用數組來存儲大數,原理通俗說就是當一個盒子(內存)無法容納一個大數,把大數分開放在多個盒子里(數組),把盒子按照順序輸出。
下面是網上找的一個代碼,注釋很清楚
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> void factorial(int n, char *pout) { if (pout == NULL) { return; } int arr[256]; int idx = 1; arr[0] = 1; //此處要注意 i從1開始 for (int i = 1; i <= n; i++) { //cry用來記錄進位 int cry = 0; // idx記錄現在有多少位 挨個相乘 for (int j = 0; j < idx; j++) { arr[j] = arr[j] * i + cry; //此處用倒序存儲 cry = arr[j] / 10; arr[j] %= 10; } //如果進位大於10 要降級 while (cry > 10) { arr[idx++] = cry % 10; cry /= 10; } //進位到這里如果還大於 0 證明位數要加1 if (cry > 0) arr[idx++] = cry; } //將數組倒序賦值給字符串 for (int i = idx - 1; i >= 0; i--) { *pout++ = arr[i] + '0'; } *pout = '\0'; return; } int main() { char buff[255] = {0}; int n = 0; printf("input n:"); scanf("%d", &n); factorial(n, buff); puts(buff); return 0; }