首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

結對程式設計實戰:一維陣列最大子陣列和與整數溢位防護

     編輯:關於C語言

結對程式設計實戰:一維陣列最大子陣列和與整數溢位防護

本文記錄結對開發過程,解決「一維陣列最大子陣列和」問題,並重點攻克整數溢位檢測難題。採用逆向思維:預先計算 INT_MAX - 目前累加和,若小於下一個加數則判定溢位,即時終止程式。

問題背景

  • 輸入:固定長度 10 的整數陣列,數值範圍 20,000,000 ~ 20,100,000
  • 目標:找出所有連續子陣列的和的最大值
  • 挑戰:數值極大,直接相加極易超過 INT_MAX (2,147,483,647) 導致未定義行為

溢位防護核心邏輯

if (INT_MAX - sum < next_val) {
    printf("數值過大,發生溢位\n");
    system("PAUSE");
    exit(1);
}
sum += next_val;

此寫法避免了實際相加後再檢查(此時已發生溢位),符合 C 語言標準的安全檢查模式。

完整演算法流程

  1. 對每個可能的子陣列起始點,累加至終點
  2. 每次累加前執行溢位檢查
  3. 記錄每種長度的最大和
  4. 最終比較所有長度的最大值

關鍵程式碼(節錄)

int shuchu(int m[], int sz, int xhy) {
    int c[10], v[10], *temp = malloc(2*sz*sizeof(int));
    // 複製子陣列
    for (int t = sz-xhy-1; t < sz; t++)
        c[t-sz+xhy+1] = m[t];
    // 計算所有前綴和
    for (int t = xhy; t >= 0; t--) {
        int sum = 0;
        for (int p = 0; p <= t; p++) {
            if (INT_MAX - sum < c[p]) { /* 溢位處理 */ }
            sum += c[p];
        }
        v[t] = sum;
        temp[t] = sum;
    }
    // 找最大
    int max = v[0];
    for (int t = 0; t <= xhy; t++)
        if (max <= v[t]) max = v[t];
    return max; // 實際回傳陣列指標,此處簡化
}

心得與體會

  • 溢位檢查必須在運算之前進行,利用 INT_MAX 與 INT_MIN 邊界
  • 結對編程中「導航員」負責邏輯驗證、「駕駛員」負責編碼,角色輪換效果顯著
  • 測試資料設計應包含邊界值(接近 INT_MAX)以驗證防護機制

改進方向

  • 改用 Kadane 演算法 O(n) 求最大子陣列和,並整合溢位檢查
  • 使用 long long 擴大範圍,或引入大數庫
  • 將溢位檢查封裝為巨集 SAFE_ADD(a,b,result) 提高複用性

此練習深刻體會到「讓程式在錯誤發生前停下」的防禦性程式設計哲學,也是結對開發中知識傳遞與品質把關的生動案例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved