題目給定區間 [-2^31, 2^31] 內的三個整數 A, B, C,判斷 A+B > C。測試用例包含邊界值 2147483647、-2147483648,直接用 int 相加會溢出(有符號溢出 UB),必須用 64 位類型 long long 計算。本文解析 C99 變長數組 (VLA) 在 OJ 環境下的支持情況、long long 掃描/打印格式化、邊界測試用例構造。
// A, B, C 讀入 int (32位足夠存儲輸入範圍) // 但 A+B 可能溢出 int,必須提升至 long long (64位) 計算 long long sum = (long long)A + (long long)B; int result = (sum > C) ? 1 : 0; // 比較時 C 隱式提升為 long long
#includeint main() { int T; scanf("%d", &T); // 測試組數 ≤ 10 // C99 變長數組 (VLA):大小由運行時變量 T 決定 // 注意:VLA 分配在棧上,T≤10 極小,安全。大數組請用 malloc。 int results[T]; for (int i = 0; i < T; i++) { int A, B, C; scanf("%d %d %d", &A, &B, &C); long long sum = (long long)A + B; // 強制提升至少一個操作數 results[i] = (sum > C) ? 1 : 0; } for (int i = 0; i < T; i++) { printf("Case #%d: %s\n", i + 1, results[i] ? "true" : "false"); } return 0; }
int a = 2147483647; // INT_MAX int b = 1; int c = a + b; // UB! 編譯器可假設不發生,導致優化錯誤 // 正確: long long c = (long long)a + b; // 2147483648
long long` 格式化輸入輸出| 操作 | 格式字符串 | 示例 |
|---|---|---|
scanf` 讀取 | %lld` 或 %lli` | scanf("%lld", &x); |
printf` 輸出 | %lld` | printf("%lld\n", x); |
無符號 unsigned long long` | %llu` | scanf("%llu", &x); |
本題輸入範圍在 int 內,故用 %d 讀入 int 變量,計算時轉 long long,避免格式化字符串不匹配風險。
malloc/free,自動釋放。int a[n] = {0} 錯誤);C11 將其改為可選特性,部分編譯器 (MSVC) 不支持。T ≤ 10,極小,棧壓力可忽略,PAT OJ (GCC) 完美支持。int *results = malloc(T * sizeof(int)); 用完 free(results);。| A | B | C | A+B | 結果 | 說明 |
|---|---|---|---|---|---|
| 1 | 2 | 3 | 3 | false | 相等不大於 |
| 2 | 3 | 4 | 5 | true | 正常 |
| 2147483647 | 0 | 2147483646 | 2147483647 | true | INT_MAX 邊界 |
| 0 | -2147483648 | -2147483647 | -2147483648 | false | INT_MIN 邊界 |
| -2147483648 | -1 | -2147483649 | -2147483649 | true | 負溢出測試 (需 long long) |
五、 總結:避坑檢查清單
- ✅ 讀入用
int+%d,計算提升long long。- ✅ 比較
sum > C時C自動提升,無需手動轉換。- ✅ VLA
results[T]僅用於極小T,大數據用malloc。- ✅ 輸出格式完全匹配
Case #X: true/false,大小寫、冒號、空格、換行。- ✅ 循環變量
i從 0 開始,輸出i+1對應 Case 編號。核心收穫:看似簡單的 A+B 比較,實則考察有符號溢出 UB 規避、整數提升規則、C99 VLA 工程權衡、格式化輸入輸出精確匹配。養成「讀入用輸入類型、計算用足夠寬類型、比較自動提升、輸出嚴格匹配」的防禦性編程習慣,可避免 90% 的整數邊界 Bug。