擴展前題:接收用戶輸入的 n,計算 f = 1! - 2! + 3! - ... + n!。引入運行時輸入與溢出風險提示,更具實用性。
#include <stdio.h>
void f(int m);
int main() {
int n;
printf("請輸入一個數(不能太大): ");
scanf("%d", &n);
f(n);
return 0;
}
void f(int m) {
int i, j;
int k = 1;
int s = 1;
int sum = 0;
for (i = 1; i <= m; i++) {
s = 1;
for (j = 1; j <= i; j++) {
s *= j;
}
sum += s * k;
k = -k;
}
printf("%d\n", sum);
}
void f_safe(int m) {
if (m > 12) { // 13! 溢出 32 位 int
printf("警告: n > 12 會導致 int 溢出,建議用 long long\n");
// 可選:自動切換 long long 邏輯
}
long long fact = 1, sum = 0;
int sign = 1;
for (int i = 1; i <= m; i++) {
fact *= i;
sum += fact * sign;
sign = -sign;
}
printf("結果 (long long): %lld\n", sum);
}
if (scanf("%d", &n) != 1) {
printf("輸入無效,請輸入整數\n");
return 1;
}
scanf 留下換行符可能影響後續輸入,建議加 while(getchar() != '\n'); 清理。
void f_optimized(int m) {
long long fact = 1, sum = 0;
int sign = 1;
for (int i = 1; i <= m; i++) {
fact *= i; // 遞推計算階乘
sum += fact * sign;
sign = -sign;
}
printf("優化版結果: %lld\n", sum);
}
| 類型 | 最大安全 n | 最大值 | 位數 |
|---|---|---|---|
| int (32位) | 12 | 2,147,483,647 | 10位 |
| long long (64位) | 20 | 9,223,372,036,854,775,807 | 19位 |
| double (近似) | 170 | ~1e308 | 308位 |
交互式階乘級數求和將「固定 n」升級為「通用計算器」,引入了輸入驗證、類型選擇、算法優化等工程關鍵點。建議學習者:
long long 版本支持到 n=20;