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

C語言一維數組賦值與約數查找邏輯錯誤修正

     編輯:C 語言問答

數組操作與約數查找:兩個典型新手錯誤修正

片段 1:數組賦值邏輯混淆

int a[10], b = 3;
for (i = 0; i < 10; i++) a[i] = 0;  // 全部初始化為 0
int j = 3;
a[j] = b;  // a[3] = 3
printf("%d", a[j]);  // 輸出 3 ✅

此段邏輯正確,但極其簡單。重點在於理解:

  • a[i] = 0 遍歷賦值 vs int a[10] = {0} 定義時初始化。
  • a[j] = b 是複製值,而非建立關聯。後續修改 b 不影響 a[3]。

片段 2:約數查找輸出索引錯誤 (核心問題)

for (j = 2, k = 0; j <= a[i]; j++) {
    if (a[i] % j == 0) {  // j 是約數
        u[k] = j; k++;
        printf("u[k]=%d, j=%d", u[k], j);  // ❌ 錯誤!k 已經 ++
    }
}

錯誤分析

  1. k++ 在 printf **之前** 執行,導致 k 已指向下一個空位。
  2. u[k] 讀取的是**未寫入的垃圾值** (或 0),而非剛存入的 j。

修正版

for (j = 2, k = 0; j <= a[i]; j++) {
    if (a[i] % j == 0) {
        u[k] = j;
        printf("u[%d]=%d, j=%d\n", k, u[k], j);  // 先打印,用 u[k]
        k++;  // 最後遞增
    }
}

或更清晰:

for (j = 2; j <= a[i]; j++) {
    if (a[i] % j == 0) {
        int idx = k++;
        u[idx] = j;
        printf("u[%d]=%d, j=%d\n", idx, u[idx], j);
    }
}

完整約數查找程序

#include <stdio.h>

int main() {
    int n;
    printf("輸入正整數: ");
    scanf("%d", &n);
    if (n <= 1) { printf("無真約數\n"); return 0; }

    int divisors[1000], cnt = 0;
    for (int d = 2; d <= n; ++d) {  // 含 n 本身
        if (n % d == 0) divisors[cnt++] = d;
    }

    printf("%d 的約數(含自身): ", n);
    for (int i = 0; i < cnt; ++i) printf("%d ", divisors[i]);
    putchar('\n');
    return 0;
}

核心原則

  • 寫入後立即使用索引,再遞增計數器。
  • 循環體內盡量用局部變量保存當前索引,避免共享計數器混亂。
  • 邊界條件:j <= n 包含 n,j < n 不包含 (真約數)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved