r1,r2,r3,r4,c1,c2,c3,c4,d1,d2 含隨機垃圾值,+= 結果不可預測。c3、c4 迴圈仍用 i=0; i<16; i+=4,導致重複累加第 0、4、8、12 欄。d1 迴圈內 i+=1 破壞外層 i+=4,d2 起始索引、步長、邊界皆錯。| 位置 | 索引公式 | 範例 (4×4) |
|---|---|---|
| 第 r 列 (0~3) | base = r*4, 索引 base .. base+3 | 列 1: 4,5,6,7 |
| 第 c 欄 (0~3) | 索引 c, c+4, c+8, c+12 | 欄 2: 2,6,10,14 |
| 主對角線 | 索引 0, 5, 10, 15 (即 i*5) | a[0],a[5],a[10],a[15] |
| 副對角線 | 索引 3, 6, 9, 12 (即 3 + i*3) | a[3],a[6],a[9],a[12] |
#include <stdio.h>
#define N 16
int main() {
int a[N] = {0};
int r[4] = {0}, c[4] = {0}, d1 = 0, d2 = 0;
printf("Enter 16 numbers (1-16 any order):\n");
for (int i = 0; i < N; ++i) {
if (scanf("%d", &a[i]) != 1) return 1;
}
// 輸出矩陣 & 計算列和
for (int rIdx = 0; rIdx < 4; ++rIdx) {
for (int cIdx = 0; cIdx < 4; ++cIdx) {
int idx = rIdx * 4 + cIdx;
printf("%3d", a[idx]);
r[rIdx] += a[idx];
c[cIdx] += a[idx];
if (rIdx == cIdx) d1 += a[idx]; // 主對角線
if (rIdx + cIdx == 3) d2 += a[idx]; // 副對角線
}
printf("\n");
}
printf("Row sums: %3d %3d %3d %3d\n", r[0], r[1], r[2], r[3]);
printf("Col sums: %3d %3d %3d %3d\n", c[0], c[1], c[2], c[3]);
printf("Diag sums: %3d %3d\n", d1, d2);
return 0;
}
= {0}),消除未定義行為。r==c (主)、r+c==N-1 (副),比手算索引公式更不易出錯。%3d 對齊,視覺清晰。void print_sums(int *a, int n) {
vector<int> r(n,0), c(n,0); int d1=0,d2=0;
for(int i=0;i
總結: 原代碼核心問題是**未初始化**與**索引計算硬編碼錯誤**。改用雙層迴圈統一索引邏輯、定義即初始化、幾何關係判斷對角線,代碼行數減少、正確性大增、易於泛化。