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

二维矩阵X形区域元素求和问题求助(中间元素仅统计一次)

解决二维矩阵X形元素累加问题

看起来你现在的代码逻辑没精准抓住X形元素的核心特征,还没处理好下三角和中间元素的重复累加问题。咱们先理清楚X形元素的定义:X形由主对角线(行号等于列号,即i == j)和副对角线(行号+列号等于矩阵阶数-1,即i + j == n - 1)的元素组成,当矩阵阶数n为奇数时,中间的那个元素会同时属于两条对角线,所以只能累加一次。

现有代码问题分析

你当前的x函数里用了pr=n和i<n/2 +n%2的循环,这个逻辑没有精准定位到两条对角线的元素,反而可能误加了非对角线的元素,而且完全没处理下三角部分的对角线元素,自然得不到正确结果。

修正后的代码实现

这里有两种简洁可靠的实现方式,你可以根据习惯选择:

方法一:遍历所有元素,判断是否属于X形(自动去重中间元素)

这种方法最直观,遍历矩阵的每个元素,只要满足主对角线或副对角线的条件就累加——中间元素只会被判断一次(满足两个条件但只会加一次):

void x(int niz[20][20], int n){
    int i, j, suma = 0;
    for(i = 0; i < n; i++){
        for(j = 0; j < n; j++){
            // 判断是否在主对角线或副对角线上
            if(i == j || i + j == n - 1){
                suma += niz[i][j];
            }
        }
    }
    printf("X形元素累加和为:%d\n", suma);
}

方法二:分别遍历两条对角线,减去重复的中间元素(如果存在)

如果想分开处理两条对角线,可以先累加主对角线,再累加副对角线,然后当n为奇数时,减去一次中间重复的元素:

void x(int niz[20][20], int n){
    int i, suma = 0;
    // 累加主对角线元素
    for(i = 0; i < n; i++){
        suma += niz[i][i];
    }
    // 累加副对角线元素
    for(i = 0; i < n; i++){
        suma += niz[i][n - 1 - i];
    }
    // 如果n是奇数,中间元素被累加了两次,需要减去一次
    if(n % 2 == 1){
        int mid = n / 2;
        suma -= niz[mid][mid];
    }
    printf("X形元素累加和为:%d\n", suma);
}

测试示例矩阵

用你给出的3阶矩阵测试:

1 1 1
0 1 0
1 1 1

两种方法计算的结果都是5(对应元素是(0,0),(0,2),(1,1),(2,0),(2,2),和为1+1+1+1+1=5),完全符合预期。

补充说明

  • 你的write函数用来读取矩阵元素,逻辑是正常的,不需要修改。
  • 两种方法都能正确处理奇数阶和偶数阶的矩阵:比如4阶矩阵的X形元素没有重复,方法二里的减操作不会执行。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:57:52