C语言计算二维矩阵各列总和并获取总和最大列索引的实现方法
C语言计算二维数组最大和列索引实现
原有实现的错误点
- 累加变量a、b、c、d未初始化,初始值为内存随机值,计算结果必然错误
- 数组索引写反,访问
m[i][j]时i是列索引最大为3,而数组行数只有3,会触发数组越界访问 - 连续比较语法错误,C语言中
a>b>c>d是从左到右依次运算,而非判断四个值的大小关系,逻辑完全不符合预期 - 多分支判断未做互斥,最后的else仅和倒数第一个if配对,分支判断逻辑混乱
- 硬编码4个变量存储列和,扩展性极差,修改宏定义COL的值就要重写逻辑
正确完整实现代码
#include <stdio.h> #define ROW 3 #define COL 4 void input(int m[][COL]) ; int getMaxColSumIndex(int m[][COL]) ; int main(){ int mat[ROW][COL], maxColIndex; input(mat); maxColIndex = getMaxColSumIndex(mat); printf("总和最大的列的索引是:%d\n", maxColIndex); } // 输入二维数组元素 void input(int m[][COL]) { int r,c; for (r=0 ; r<ROW ; r++){ printf("\n请输入第%d行的元素:\n", r); for (c=0 ; c<COL ; c++) scanf("%d", &m[r][c]); } } // 计算每列总和,返回总和最大的列的索引(有多个最大值时返回第一个出现的索引) int getMaxColSumIndex(int m[][COL]) { int col_sum[COL] = {0}; // 存储每列的总和,初始化为0 int r, c; // 遍历计算每列总和 for (c = 0; c < COL; c++) { for (r = 0; r < ROW; r++) { col_sum[c] += m[r][c]; } } // 查找最大值对应的索引 int max_index = 0; for (c = 1; c < COL; c++) { if (col_sum[c] > col_sum[max_index]) { max_index = c; } } return max_index; }
实现说明
- 用数组
col_sum存储每列的总和,适配任意COL值的场景,无需修改核心逻辑 - 遍历顺序为外层循环列、内层循环行,符合二维数组列累加的访问逻辑
- 查找最大值时只需要一次遍历,默认返回第一个出现的最大和列的索引,如果需要处理并列最大的场景可以在判断分支里补充对应的输出逻辑即可
内容的提问来源于stack exchange,提问作者Maorb17
相关产品推荐
相关产品推荐

