C语言基础练习——最大值及其位置(二维数组)
时间限制: 1 Sec 内存限制: 10 MB题目描述
有一个n×m的矩阵,要求编程序求出:
每行元素的最大值,以及其所在的行号和列号。求出所有元素的最大值,以及其所在的行号和列号。
每行元素的最大值,以及其所在的行号和列号。求出所有元素的最大值,以及其所在的行号和列号。
输入
先输入n,m (2<=n<=100,2<=m<=100)
在输入矩阵中各元素的值。(假设为整型数)
在输入矩阵中各元素的值。(假设为整型数)
输出
先输出每行元素的最大值的下标及其值,每个占一行;
再输出所有元素的最大值的下标及其值。
再输出所有元素的最大值的下标及其值。
样例输入 Copy
3 4
1 2 3 4
10 11 12 13
3 4 5 6
样例输出 Copy
0 3 4
1 3 13
2 3 6
1 3 13
下面是实现代码:
1 #include <stdio.h> 2 int main() 3 { 4 int a[100][100],b[101][2]; 5 int n,m,i,k; 6 scanf("%d%d",&n,&m); 7 for(i=0; i<n; i++) 8 { 9 for(k=0; k<m; k++) 10 { 11 scanf("%d",&a[i][k]); //输入 12 } 13 } 14 for(i=0; i<n; i++) //找每行最大值 15 { 16 int max=a[i][0]; //假定行首为最大值 17 b[i][0]=i; //行首行号 18 b[i][1]=0; //行首列号 19 for(k=1; k<m; k++) 20 { 21 if(max<a[i][k]) 22 { 23 max=a[i][k]; //修改第i行最大值 24 b[i][1]=k; //行内最大值,只有列号变化 25 } 26 } 27 printf("%d %d %d\n",b[i][0],b[i][1],max); //输出第i行最大值及其行号列号 28 } 29 int maxmax; //整个数组的最大值 30 for(i=0; i<n; i++) 31 { 32 int x=b[i][0]; //第i行最大值的行号 33 int y=b[i][1]; //第i行最大值的列号 34 if(i==0) //第0行 35 { 36 maxmax=a[x][y]; //假定第0行最大值为数组最大值 37 b[n][0]=0; //行号 38 b[n][1]=0; //列号 39 } 40 else //其他行 41 { 42 if(maxmax<a[x][y]) 43 { 44 maxmax=a[x][y]; //修改数组最大值 45 b[n][0]=x; //行号 46 b[n][1]=y; //列号 47 } 48 } 49 } 50 printf("%d %d %d",b[n][0],b[n][1],maxmax); //输出数组最大值及其行号列号 51 return 0; 52 }
(思路和代码对照着看)
我的思路是定义数组a[100][100]用于输入数据,定义数组b[101][2]用于保存数组a每行最大值所在的行号和列号
如果输入100行数据:
a[0]行最大值的行号保存到b[0][0],列号保存到b[0][1]
a[1]行最大值的行号保存到b[1][0],列号保存到b[1][1]
. . . . . .
a[99]行最大值的行号保存到b[99][0],列号保存到b[99][1]
整个数组a最大值的行号保存到b[100][0],列号保存到b[100][1]
先用一个nxm的循环输入数据
然后for循环i从0到n-1,找每一行的最大值。
先假定每行的行首是最大值,即max=a[i][0],当前行号为i,保存到b[i][0];列号为0,保存到b[i][1]
嵌套一个for循环k从1到n-1,让max和a[i][1]……a[i][n-1]比较,如果max<a[i][k],则修改max及其行号列号
嵌套循环结束后输出本行最大值及其行号列号
经过上面的循环,数组a每行最大值的行号列号都已经保存到数组b中
最后来一个for循环i从0到n-1,从每行的最大值中找数组的最大值
这里我把每行最大值行号和列号先赋值给x和y,如果我写在一起可能看这篇文章的人就看不懂了
如果直接嵌套写就是这样,a[b[i][0]][b[i][1]],即代码中的a[x][y]
先假定数组最大值是第一行的最大值,然后让其他行最大值与之比较,如果maxmax<a[x][y],则修改maxmax及其行号列号
程序最后输出数组最大值及其行号列号