副对角线元素满足行索引i与列索引j之和等于n−1(即i+j==n−1),其中n为方阵阶数;非方阵需取min(m,n)防越界,遍历时须校验列索引有效性。

副对角线的索引规律是什么
副对角线(从右上到左下)在方阵中满足:行下标 i + 列下标 j == n - 1,其中 n 是方阵边长。比如 5x5 数组,副对角线元素是 a[0][4]、a[1][3]、a[2][2]、a[3][1]、a[4][0]。
- 非方阵(如
3x4)没有严格定义的“副对角线”,通常只对主对角线或按最小边取截断处理 - 如果强行遍历所有满足
i + j == n - 1的位置,需确保j不越界(尤其当数组列数 ≠ 行数时)
用 for 循环直接累加最稳妥
对 n x n 方阵,只需一个循环,用 i 遍历行,对应列就是 n - 1 - i:
int sum = 0; for (int i = 0; i
- 不要用
for (int i = 0, j = n-1; i 这种双变量写法,容易因符号或边界出错 - 若数组是动态分配(如
int** a),只要保证a[i]和a[i][n-1-i]合法即可,逻辑不变 - 注意:C++ 数组下标从 0 开始,别写成
n - i(会越界)
用 std::accumulate 配合 lambda 会更简洁但有坑
可以借助 std::accumulate,但必须确保访问的是连续内存或构造可迭代序列:
int sum = std::accumulate(
a, a + n,
0,
[n](int acc, int* row) { return acc + row[n - 1 - (&row - &a[0])]; }
);
- 这个写法依赖
&row - &a[0]计算当前行号,实际中易出错,不推荐 - 更安全的做法仍是传统循环;STL 优势不在这种简单索引场景
- 如果用
std::vector<:vector>></:vector>,不能直接传v.begin()给accumulate去加“某列”,因为不是扁平结构
常见错误:把副对角线和反对角线/次对角线概念搞混
- “副对角线”在中文教材里通常就指右上→左下的那条,即 anti-diagonal 或 secondary diagonal,不是“除了主对角线以外的所有对角线”
- 错误写法:
sum += a[i][i] → 这是主对角线
- 错误写法:
sum += a[i][j] 外层 i、内层 j 双重循环再判断 i + j == n - 1 → 效率低,且容易漏判或重复加
- 调试时可先打印
i 和 n - 1 - i 确认是否在合法范围内,特别是 n == 0 或 n == 1 边界情况
sum += a[i][i] → 这是主对角线sum += a[i][j] 外层 i、内层 j 双重循环再判断 i + j == n - 1 → 效率低,且容易漏判或重复加i 和 n - 1 - i 确认是否在合法范围内,特别是 n == 0 或 n == 1 边界情况副对角线求和本质是索引映射问题,核心就一条:确认数组是方阵,然后用 i 推出唯一对应的 j。其它包装只是增加出错概率。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











