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

C 語言循環邏輯錯誤:求 1-3+5-7+...+101 導致死循環分析

     編輯:程式設計綜合問答

錯誤代碼

int number = 1, value = 0, sign = 1;
while (number < 101) {
    value += number;
    number += 2;
    sign = -sign;
    number *= sign;  // 關鍵錯誤行
}
printf("%d", value);

死循環根因分析

  1. sign 在 1 和 -1 之間翻轉。
  2. number *= sign 導致 number 在正負值間跳躍:
    初始 1 → +2=3 → ×(-1)=-3 → +2=-1 → ×1=-1 → +2=1 → ×(-1)=-1 ...
  3. number 始終在 -3, -1, 1 之間循環,**永遠小於 101**,循環條件永真。

正確邏輯:分離「項值」與「符號」

數列規律:奇數項為正,偶數項為負,絕對值為等差數列 1,3,5...101。

方法一:雙步長累加(最直觀)

int total = 1;  // 首項
int num = 1;
while (num < 101) {
    num += 2;       // 3
    total -= num;   // -3
    num += 2;       // 5
    total += num;   // +5
    // 循環直到 num >= 101
}
printf("%d", total);

方法二:統一公式(通用性強)

int sum = 0;
for (int i = 1, sign = 1; i <= 101; i += 2, sign = -sign) {
    sum += sign * i;
}
printf("%d", sum);

方法三:數學求和(O(1))

數列為等差數列分組:(1-3) + (5-7) + ... + (97-99) + 101
每組和為 -2,共 25 組(1 到 99 共 50 項),最後加 101:
sum = 25 * (-2) + 101 = 51

調試技巧

  • 在循環體內打印關鍵變量:printf("num=%d, sign=%d, total=%d\n", number, sign, value);
  • 觀察變量軌跡,快速定位邏輯偏離點。
  • 使用 IDE 斷點單步執行,監視變量變化。

核心教訓

  1. 循環變量不要在循環體內做符號翻轉運算,除非極其確定收斂條件。
  2. 將「業務邏輯」(符號交替)與「控制邏輯」(循環遞增)解耦,使用獨立變量。
  3. 優先考慮 for 循環處理已知次數迭代,語義更清晰。

這道題精準暴露了初學者對循環控制變量管理的薄弱環節,修正後邏輯清晰且高效。

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