You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求矩形矩阵反对角线下方元素和:现有代码出错求助

解决矩阵反对角线下方元素求和的问题

首先,我们先拆解你的问题和现有代码的问题所在:

问题分析

你的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

你的现有代码存在两个关键错误:

  1. 数组下标越界:j从4开始,但数组列下标最大为3,访问arr[i][4]会触发未定义行为,程序必然出错
  2. 逻辑完全偏离需求:没有筛选反对角线下方的元素,反而错误遍历了不存在的下标,完全没实现目标功能

正确解决方案

我们可以通过判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:44:24