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

C語言循環語句錯誤導致無法輸出完全數?教你正確編寫查找完全數程式

     編輯:程式設計綜合問答

問題背景

完全數是指其所有真因子(不包括自身)之和等於自身的數。例如 6 = 1+2+3,28 = 1+2+4+7+14。題目要求編寫 C 語言程式,找出 2 到 20000 之間的所有完全數,並輸入整數 n,輸出第 n 個完全數。

原始代碼存在的邏輯缺陷

提問者提供的代碼中,判斷是否為完全數的 `if (i == s)` 被錯誤地放在了內層循環(遍歷因子)內部。這導致在累加因子的過程中,只要中間某一步 `s` 恰好等於 `i`,就會誤判為完全數並增加計數器 `k`,最終導致輸出結果錯誤甚至無輸出。

修正後的完整代碼

#include <stdio.h>

int main() {
    int i, n, s = 0, k = 0;
    printf("請輸入要查找的完全數序號: ");
    scanf("%d", &n);

    for (i = 2; i <= 20000; i++, s = 0) {
        // 優化:因子最大不超過 i/2
        for (int j = 1; j <= i / 2; j++) {
            if (i % j == 0) {
                s += j;
            }
        }
        // 判斷完全數的邏輯必須放在內層循環結束後
        if (i == s) {
            k++;
            if (k == n) {
                printf("第 %d 個完全數是: %d\n", n, i);
                break;
            }
        }
    }

    if (k < n) {
        printf("在 20000 範圍內不足 %d 個完全數。\n", n);
    }
    return 0;
}

關鍵修正點解析

  • 判斷位置後移:`if (i == s)` 必須在內層 `for` 循環結束、所有因子累加完成後執行。
  • 循環優化:內層循環條件改為 `j <= i/2`,因為大於 `i/2` 的數不可能是 `i` 的真因子,減少一半迭代次數。
  • 變量重置:外層循環的初始化部分 `i++, s=0` 確保每次檢查新數時 `s` 歸零。

補充說明

在 20000 範圍內僅存在 4 個完全數:6、28、496、8128。若輸入 n > 4,程式會提示不足。

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