首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言多組測資處理常見錯誤:迴圈控制變數未重置導致第二組輸出錯誤

     編輯:程式設計疑難解答

題目要求輸入 T 組測資,每組給 a, b 區間,統計包含數字 6 且不含數字 9 的整數個數。原始碼在 while(scanf("%d",&n)==1) 迴圈中處理多組測資,但計數器 k 與測資數 n 的邏輯錯誤,導致第二組之後結果錯誤。

原始碼關鍵問題

while(scanf("%d",&n)==1) {  // n 只讀一次,之後不再更新
    // ...
    k++;
    if(k>=n) break;          // k 遞增,n 不變,永遠只能跑 n 組
}

實際上 n 是總測資組數,應在每組處理完後遞減 n--,或改用 for(int i=0;i 結構。

修正後的主迴圈架構

int T;
scanf("%d", &T);          // 讀取總測資組數
while (T--) {             // 每處理一組 T 遞減,自然結束
    long a, b;
    scanf("%ld %ld", &a, &b);
    long count = 0;
    for (long i = a; i <= b; i++) {
        long t = i;
        bool has6 = false, has9 = false;
        while (t) {
            int d = t % 10;
            if (d == 6) has6 = true;
            if (d == 9) { has9 = true; break; }
            t /= 10;
        }
        if (has6 && !has9) count++;
    }
    printf("%ld\n", count);
}

關鍵修正點總結

  • 測資迴圈控制:用 while(T--) 或 for 迴圈,避免手動管理計數器。
  • 變數作用域:count、has6、has9 等在每組測資內部宣告/重置,防止跨組污染。
  • 邊界條件:注意 a、b 可能為 0,while(t) 在 t=0 時不執行,需額外處理 0 本身是否含 6/9(題目通常 0 不含 6,故不計入)。
  • 效能優化:若 b 很大(如 10^9),逐數檢查會超時,需改用數位 DP (Digit DP) 算法,但本題測資範圍不明,先確保邏輯正確。

養成「讀總數 → 迴圈總數次 → 每次內部變數歸零」的模板習慣,能避免 90% 多組測資錯誤。

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