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]。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 已經 ++
}
}
k++ 在 printf **之前** 執行,導致 k 已指向下一個空位。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 不包含 (真約數)。