求矩形矩阵反对角线下方元素和:现有代码出错求助
解决矩阵反对角线下方元素求和的问题
首先,我们先拆解你的问题和现有代码的问题所在:
问题分析
你的3行4列矩阵结构如下:
int arr[3][4] = { {1, 2, 3, 4}, // 行0 {5, 6, 7, 8}, // 行1 {9, 1, 2, 3} // 行2 };
根据你标注的反对角线(对应元素3(0,2)、6(1,1)、9(2,0)),这条线的核心特征是行下标i + 列下标j = 2,反对角线下方的元素就是满足i + j > 2的元素,具体包括:
- 行0:j=3 → 元素4
- 行1:j=2、3 → 元素7、8
- 行2:j=1、2、3 → 元素1、2、3
你的现有代码存在两个关键错误:
- 数组下标越界:j从4开始,但数组列下标最大为3,访问
arr[i][4]会触发未定义行为,程序必然出错 - 逻辑完全偏离需求:没有筛选反对角线下方的元素,反而错误遍历了不存在的下标,完全没实现目标功能
正确解决方案
我们可以通过判断i + j > 2来精准筛选目标元素,基础实现代码如下:
#include <stdio.h> int main() { int arr[3][4] = {1,2,3,4, 5,6,7,8, 9,1,2,3}; int sum = 0; // 遍历每一行 for (int i = 0; i < 3; i++) { // 遍历每一列 for (int j = 0; j < 4; j++) { // 判断是否在目标区域内 if (i + j > 2) { sum += arr[i][j]; } } } printf("反对角线下方元素之和:%d\n", sum); // 输出结果为25 return 0; }
如果想优化循环次数(减少不必要的判断),可以直接从符合条件的列开始遍历:
#include <stdio.h> int main() { int arr[3][4] = {1,2,3,4, 5,6,7,8, 9,1,2,3}; int sum = 0; for (int i = 0; i < 3; i++) { // 对于第i行,直接从满足i+j>2的最小列开始遍历 for (int j = 3 - i; j < 4; j++) { sum += arr[i][j]; } } printf("反对角线下方元素之和:%d\n", sum); // 同样输出25 return 0; }
扩展说明
如果你的反对角线定义是另一种(比如从右上角(0,3)到左下角(2,0)的那条线,满足i + j = 5),只需要把判断条件改成i + j < 5即可,灵活调整条件就能适配不同的反对角线定义。
内容的提问来源于stack exchange,提问作者YUreee
相关产品推荐
相关产品推荐

