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

C 語言循環嵌套找完全數:變量作用域與判斷時機導致邏輯錯誤

     編輯:程式設計綜合問答

問題代碼對比

兩版代碼唯一差別:if (i == s) k++; 的位置——版本一在內層循環內,版本二在外層循環內。版本一無輸出,版本二正常。

錯誤根因

變量 s 在內層循環中逐漸累加。版本一每次累加後立即判斷 i == s,若中間某步恰好相等(但最終 s > i),k 會被錯誤遞增,導致計數失真。

// 版本一:錯誤
for (i = 2; i <= 20000; i++, s = 0) {
    for (j = 1; j < i; j++) {
        if (i % j == 0) s += j;
        if (i == s) k++; // 過早判斷!s 還在累加中
    }
    if (k == n) { ... }
}

// 版本二:正確
for (i = 2; i <= 20000; i++, s = 0) {
    for (j = 1; j < i; j++) {
        if (i % j == 0) s += j;
    }
    if (i == s) k++; // 內層循環結束,s 確定,再判斷
    if (k == n) { ... }
}

完全數定義與優化

  • 完全數:真因子和等於自身(如 6=1+2+3, 28=1+2+4+7+14)。
  • 2-20000 間僅有 4 個:6, 28, 496, 8128。
  • 優化:內層循環只需跑到 i/2 或 sqrt(i),成對累加因子。

總結

累加類變量的最終判斷,必須放在累加循環結束之後。這是「邏輯時機」錯誤的典型案例:變量未穩定時過早使用,導致中間態污染結果。調試時多打印關鍵變量變化,一眼可見。

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