#include
int main() {
int i = 1;
unsigned long long fact = 1; // 64位無符號,範圍 0 ~ 1.84e19
while (i <= 100) {
fact *= i;
i++;
}
printf("100! = %llu\n", fact);
return 0;
}
⚠️ **100! ≈ 9.33×10¹⁵⁷ 遠超 64 位整數範圍**,上述代碼會**靜默溢出繞回**,輸出錯誤結果。
// 編譯: gcc -lgmp fact100.c
#include
#include
int main() {
mpz_t fact;
mpz_init_set_ui(fact, 1);
for (int i = 2; i <= 100; i++)
mpz_mul_ui(fact, fact, i);
gmp_printf("100! = %Zd\n", fact);
mpz_clear(fact);
return 0;
}
#include
#define BASE 1000000000 // 10^9,每個元素存 9 位十進制
#define WIDTH 9
int a[500] = {1}; // 足夠存 100! (約 158 位十進制)
void mul_int(int *a, int m) {
long long carry = 0;
for (int i = 0; a[i] || carry; i++) {
carry += (long long)a[i] * m;
a[i] = carry % BASE;
carry /= BASE;
}
}
void print_big(int *a) {
int i = 499;
while (i > 0 && a[i] == 0) i--;
printf("%d", a[i--]);
for (; i >= 0; i--) printf("%0*d", WIDTH, a[i]);
puts("");
}
int main() {
for (int i = 2; i <= 100; i++) mul_int(a, i);
print_big(a);
return 0;
}
# Python
import math
print(math.factorial(100))
# bc (Linux 計算器)
echo 'define f(x) { if (x<=1) return 1; return x*f(x-1) }; f(100)' | bc
| 點 | 說明 |
|---|---|
| 初始化 | int i = 1; fact = 1; 必須在迴圈前 |
| 條件 | i <= 100 含邊界 |
| 更新 | i++ 在迴圈體末尾(或開頭配合 continue) |
| 等價 for | for (int i=1; i<=100; i++) fact *= i; 語義更集中 |
| 溢出檢測 | 無符號溢出定義為模 2⁶⁴,需手動檢查 if (fact > ULLONG_MAX / i) overflow |