计算机考研复试上机题 —— 最大的两个数 (华中科技大学)

 

 

思路:

  1. 将矩阵存放于二维数组中,遍历数据,按行遍历,但处理的时候是按列处理;

  2. 设定两个最大值,只要出现比第二大的数都更大数就替换,每次替换的肯定是第二大的数;

  3. 注意需要按行保持输出顺序,即最大的两个数需要根据行号顺序输出;

C++代码:

  

 1 #include<iostream>
 2 #include<string>
 3 
 4 using namespace std;
 5 
 6 const int r=4, c=5;
 7 int matrix[r][c];
 8 int maxn[c][2];
 9 int startNum;
10 
11 
12 void init() {
13     for(int i=0; i<c; i++) {
14         //int: 32位, 1000...00 为负的最大, 即int表示的最小数值 
15         maxn[i][0] = maxn[i][1] = 0x80000000;
16     }
17 } 
18 
19 
20 //寻找最大和次大值 
21 void findMaxNum(int row, int column) {
22     for(int k=0; k<column; k++) {
23         for(int i=0; i<row; i++) {
24             //处理对应的列 
25             int temp = matrix[i][k];
26             int minNum = min(maxn[k][0], maxn[k][1]);    
27             int maxNum = max(maxn[k][0], maxn[k][1]);
28             //每次只替换一个, 所以只有高于第二大值即可保留 
29             if(temp > minNum) {
30                 //不管替换哪个, 原来最大的数肯定保留, 而且顺序还在前面 
31                 maxn[k][0] = maxNum;
32                 //新来的不管最大还是第二大, 都得排后面 
33                 maxn[k][1] = temp;
34             }
35         }
36     }
37 }
38 
39 
40 void solve(int row, int column) {
41     //4*5矩阵数据读取 
42     for(int i=0; i<row; i++) {
43         for(int k=0; k<column; k++) {
44             if(!i && !k) {
45                 matrix[i][k] = startNum;
46             }else {
47                 cin>> matrix[i][k]; 
48             }
49         }
50     }
51     //挑选每一列的最大值和次大值 
52     findMaxNum(row, column);
53     for(int i=0; i<2; i++) {
54         for(int k=0; k<column; k++) {
55             if(k) cout<< " ";
56             cout<< maxn[k][i];
57         }
58         cout<< endl;
59     }    
60 }
61 
62 
63 int main() {
64     while(true) {
65         //初始化 
66         init();
67         if(cin>> startNum) {
68             solve(4, 5);
69         }else {
70             break;
71         }
72     }
73     
74     return 0;
75 }

猜你喜欢

转载自www.cnblogs.com/Lunix-touch/p/12333964.html