二维矩阵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
相关产品推荐
相关产品推荐

