码迷,mamicode.com
首页 > 编程语言 > 详细

实现对编译出来的名次进行顺序排序

时间:2015-11-02 06:54:30      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:比赛结果   源程序   运动员   跳水   

  前几天,鹏哥在作业中给出了这样一道题:

  5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果

  A选手说:B第一,我第三。

  B选手说:我第二,E第四。

  C选手说:我第一,D第二。

  D选手说:C最后,我第三。

  E选手说:我第四,A第一。

  比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

这道题相信很多人都知道,程序写起来也不是特别难,其主要的源程序如下:

#include<stdio.h>

int main()

{

int a , b , c , d , e;

int ret = 0;

for (a = 1; a < 6; a++)

{

    for (b = 1; b < 6; b++)

{

for (c = 1; c < 6; c++)

   {

   for (d = 1; d < 6; d++)

{

for (e = 1; e < 6; e++)

   {

   if ((b == 1) + (a == 3) == 1 &&

       (b == 2) + (e == 4) == 1 &&

       (c == 1) + (d == 2) == 1 &&

       (c == 5) + (d == 3) == 1 &&

       (e == 4) + (a == 1) == 1)

{

           printf("a=%d,b=%d,c=%d,d=%d,e=%d\n", a, b, c, d, e);

                                 }

     }

  }

    }

}

}

system("pause");

    return 0;

}

我自己当时也是写到这里的,本以为就行了,可是输出的结果并不是所期望的:


技术分享

如图所示,这和我们所想的并不一样,照理来说应该只有第一种一个答案才对,而它将一些名次不连续的组也输出来了,有人觉得那只输出第一行不就行了,可这只是一种取巧的方法,这道题只是它的答案恰好在第一行,那如果它在第二行或第三行以及其他行数呢?所以,这个程序还是要继续改进的,这里我和大家分享下学习到的方法:

  首先我们目的是想让其按连续的顺序输出来,中间不要空出数字,那我们可以将它放入一个二进制位中,如果它存入的值是连续的1,那就说明这个次序是连续的。

      比如给定义一个 int ret=0,由于只有5个名次,所以这里ret只看它后八位,刚开始ret应该是0000 0000,如果是1的话,可直接让它和ret相或,其结果是1,如果是2的话就让1左移一位再和ret相或,如果是3就把1左移两位再相或,以此类推,如果是n的话,就让1左移(n-1)位和ret相或,这样就能确保它的名次是连续的了,具体的代码如下:

ret = ret | 1 << (a - 1);

ret = ret | 1 << (b - 1);

ret = ret | 1 << (c - 1);

ret = ret | 1 << (d - 1);

ret = ret | 1 << (e - 1);

这是我们将所有的名次存入ret中

下一步我们就该判断ret的二进制是否为连续的1,那我们可以用while循环和if语句来实现,代码如下:


while (ret)

{

if (ret % 2 == 0)

break;

else ret = ret / 2;

}

如果while循环整个执行完毕,那说明我们的ret此时为0,并且名次是按连续的顺序输出的;如果从break跳出循环的话,那此时ret就不等于0,也说明名次并不是按顺序输出的。因此整个程序的代码应该是这样的:

#include<stdio.h>

int main()

{

int a , b , c , d , e;

int ret = 0;

for (a = 1; a < 6; a++)

{

for (b = 1; b < 6; b++)

{

for (c = 1; c < 6; c++)

{

for (d = 1; d < 6; d++)

{

for (e = 1; e < 6; e++)

{

if ((b == 1) + (a == 3) == 1 &&

(b == 2) + (e == 4) == 1 &&

(c == 1) + (d == 2) == 1 &&

(c == 5) + (d == 3) == 1 &&

(e == 4) + (a == 1) == 1)

{

ret = 0;

ret = ret | 1 << (a - 1);

ret = ret | 1 << (b - 1);

ret = ret | 1 << (c - 1);

ret = ret | 1 << (d - 1);

ret = ret | 1 << (e - 1);

while (ret)

{

if (ret % 2 == 0)

break;

else ret = ret / 2;

}

if (ret == 0)

    printf("a=%d,b=%d,c=%d,d=%d,e=%d\n", a, b, c, d, e);

  

}

}

}

}

}

}

system("pause");

    return 0;

}

其运行结果如下:

技术分享

在这里要注意下每次给每个名次组存放的时候,要把ret初始化,这样就不会将上次的值再传递到这次。

整个过程和流程就是这样,当然我这也不是最简单,最好的方法,肯定还有大神有其他好的方法,如果有的话,可以在留言中分享,谢谢技术分享


实现对编译出来的名次进行顺序排序

标签:比赛结果   源程序   运动员   跳水   

原文地址:http://cuiyuxuan.blog.51cto.com/10786939/1708618

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!