最大的两个数

题目截图:

 

思路:

  先对每列四个数按数值大小逆序排序,然后对最大的两个数按索引顺序排序即可。中间用到 qsort 函数,详细用法见另一篇博客

 

代码如下:

 1 /*
 2     最大的两个数 
 3 */
 4 
 5 #include <stdio.h>
 6 #include <string.h>
 7 #include <math.h>
 8 #include <stdlib.h>
 9 #include <time.h>
10 #include <stdbool.h>
11 
12 // 结点结构体 
13 typedef struct {
14     int data;                    // 数据 
15     int index;                    // 数组下标 
16 } node;
17 
18 // 按数据大小逆序排序 
19 int cmp1(const void* a, const void* b) {
20     node* c = (node*)a;
21     node* d = (node*)b;
22     return d->data - c->data;
23 }
24 
25 // 按原数组下标大小顺序排序 
26 int cmp2(const void* a, const void* b) {
27     node* c = (node*)a;
28     node* d = (node*)b;
29     return c->index - d->index;
30 }
31 
32 int main() {
33     int array[4][5];            // 存储矩阵 
34     int a[2][5];                // 存储每列最大的两个数 
35     node l[4];                    // 存储每列四个结点 
36     while(1) {
37         int i, j;
38         for(i=0; i<4; ++i) {    // 输入矩阵 
39             for(j=0; j<5; ++j) {
40                 if(scanf("%d", &array[i][j]) == EOF) {
41                     return 0;
42                 }
43             }
44         }
45         for(j=0; j<5; ++j) {    
46             for(i=0; i<4; ++i) {    // 初始化每列结点 
47                 l[i].data = array[i][j];
48                 l[i].index = i;
49             }
50             // 排序 
51             qsort(l, 4, sizeof(l[0]), cmp1);
52             qsort(l, 2, sizeof(l[0]), cmp2);
53             for(i=0; i<2; ++i) {    // 存储每列最大的两个数 
54                 a[i][j] = l[i].data;
55             }
56         }
57         for(i=0; i<2; ++i) {        // 按要求输出 
58             for(j=0; j<5; ++j) {
59                 printf("%d ", a[i][j]);
60             }
61             printf("\n");
62         }
63     }
64 
65     return 0;
66 }

 

posted @ 2018-02-07 16:35  Just_for_Myself  阅读(336)  评论(0编辑  收藏  举报