描述
编写一个程序输入一个mXn的矩阵存储并输出,并且求出每行的最大值和每行的总和。 要求把每行总和放入每行最大值的位置,如果有多个最大值,取下标值最小的那一个作为最大值。 最后将结果矩阵输出。
输入描述:
输入的第一行包括两个整数m和n(1<=m,n<=100),分别代表矩阵的行和列的维数。 接下来的m行每行有n个数,代表矩阵的元素。
输出描述:
可能有多组测试数据,对于每组数据,输出按题目要求执行后的矩阵。
示例1
输入:
3 3 1 1 1 1 1 1 1 1 1 3 3 3 2 3 2 3 2 3 2 3
复制输出:
3 1 1 3 1 1 3 1 1 8 2 3 2 7 2 8 2 3
答案
#include <stdio.h>
int main() {
int m, n;
int a[100][100];
int i, j;
while (scanf("%d %d", &m, &n) != EOF) { // 注意 while 处理多个 case
int max[100];
int sum[100];
int maxnum[100];
for (i = 0; i < m; i++) {
max[i] = 0;
sum[i] = 0;
maxnum[i] = 0;
for (j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
if (a[i][j] > maxnum[i]) {
max[i] = j; //记录最大元素值出现的位置
maxnum[i] = a[i][j]; //记录最大元素值
}
sum[i] += a[i][j]; //求一行的和
}
}
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
if (j == max[i]) { //将该行最大元素值的位置换位该行的和
a[i][j] = sum[i];
}
printf("%d ", a[i][j]);
}
printf("\n");
}
}
return 0;
}
将代码优化一下变量
#include <stdio.h>
int main() {
int m, n;
while (scanf("%d %d", &m, &n) == 2) {
// 读取矩阵
int matrix[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &matrix[i][j]);
}
}
// 计算每行的总和和最大值
for (int i = 0; i < m; i++) {
int row_sum = 0;
int max_index = 0;
for (int j = 0; j < n; j++) {
row_sum += matrix[i][j];
if (matrix[i][j] > matrix[i][max_index]) {
max_index = j;
}
}
matrix[i][max_index] = row_sum;
}
// 输出结果矩阵
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%d", matrix[i][j]);
if (j != n - 1) {
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
最大值以及最大值出现的位置不用数组存储了,使用变量即可,每行数值都会重新计算并覆盖。
详解
按行遍历,记录最大值元素出现的位数,以及最大值,并求和,最终按要求替换即可。