有这样一个问题:5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果

A选手说:B第二,我第三;

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

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

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

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

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

那我们就有了这样一个思路:假设第一位选手名次开始为一,在这位选手为一的情况下假设第二个人为一(名次可以并列),依次假设下去,即五个循环嵌套,最后使用题目条件判断,满足条件的输出结果,代码如下:

#define _CRT_SECURE_NO_WARNINGS 1

#include

#include

int main() {

int a = 1;

int b = 1;

int c = 1;

int d = 1;

int e = 1;

for (; a <= 5; a++){

for (b = 1; b <= 5; b++){

for (c = 1; c <= 5; c++){

for (d = 1; d <= 5; d++){

for (e = 1; e <= 5; e++){

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

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

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

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

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

{

printf("final result: a=%d,b=%d,c=%d,d=%d,e=%d\n", \

a, b, c, d, e);

}

}

}

}

}

}

system("pause");

return 0;

}

打印结果如下:

得到的结果是不是大吃一惊,怎么有的结果竟然没有第一名,开始我们思路很好,代码整体也没问题,但我们忽略了这个细节,我们没有排除不正常的名次,正常的名次肯定中间的名次是不能断(简称名次断节),可以并列,甚至可以都是第一名,那么我们就可以用一种十分巧妙的方法来排除这种名次断节的情况,接下来的讲解略有难度,小伙伴认真听。

定义一个整形,使用整形的最低的五个比特位来存五位选手的名次,从右到左比特位为第一名到第五名,比特位上有1就说明对应的那一位有名次, 比如后五位为00101,有第一名,有第三名,没第二名,这显然是不正确的,,就是1之间不能夹着0,比如00011,只有第一名和第二名,名次存在并列,这显然可以,我们只需在原先条件后加点筛选条件就好了,

判断条件如下:

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

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

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

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

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

{

int flag = 0;//他的后五位比特位存名次

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

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

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

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

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

while (flag)//比特位存在1,跳出这个循环有两种情况,\

一种是1之间夹着0,一种是比特位全部向右移动完遇到0退出循环

{

if (!(flag & 1))//排除是110等最低位为0的情况,

{

break;

}

flag >>= 1;//最低位不是0就向后移一位再检查最低位是不是0

}

if (flag == 0)//满足flag==0说明比特位正常移动完毕,比如00111,

这是个可以的结果,flag>>1执行三次之后最低位遇到0,跳出 \

while(flag)的循环,到了这里后flag为00000,flag==0,满足条件,\

输出正确结果

{

printf("final result: a=%d,b=%d,c=%d,d=%d,e=%d\n", \

a, b, c, d, e);

}

}

int flag = 0;//这段代码的作用是每次得到一个满足原始\

条件的a b c d e的数字时用1移位,比如得到a=1,b=2,c=1,d=2,e=3,

flag = flag|(1 << (a - 1));//flag二进制为00001

flag = flag|(1 << (b - 1));//flag二进制为00011

flag = flag|(1 << (c - 1));//flag二进制为00011

flag = flag|(1 << (d - 1));//flag二进制为00011

flag = flag|(1 << (e - 1));//flag二进制为00111//这个00111结果是满足条件的,所以最后输出abcde相应的值

完整代码:

#define _CRT_SECURE_NO_WARNINGS 1

#include

#include

int main() {

int a = 1;

int b = 1;

int c = 1;

int d = 1;

int e = 1;

for (; a <= 5; a++){

for (b = 1; b <= 5; b++){

for (c = 1; c <= 5; c++){

for (d = 1; d <= 5; d++){

for (e = 1; e <= 5; e++){

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

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

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

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

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

{

int flag = 0;

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

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

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

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

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

while (flag)//比特位存在1,跳出这个循环有两种情况,\

一种是1之间夹着0,一种是比特位全部向右移动完遇到0退出循环

{

if (!(flag & 1))//

{

break;//排除是110等最低位为0的情况,

}

flag >>= 1;//最低位不是0就向后移一位再检查最低位是不是0

}

if (flag == 0)//满足flag==0说明比特位正常移动完毕,比如00111,\

这是个可以的结果,flag>>1执行三次之后最低位遇到0,跳出 \

while(flag)的循环,到了这里后flag为00000,flag==0,满足条件,\

输出正确结果

{

printf("final result: a=%d,b=%d,c=%d,d=%d,e=%d\n", \

a, b, c, d, e);

}

}

}

}

}

}

}

system("pause");

return 0;

}

正确结果:

c语言计算跳水分数,C语言判断五位选手跳水名次相关推荐

  1. C语言计算级数fun,c语言编程 编写函数fun(),它的功能是:计算和输出下列级数的和....

    用C语言编程,已知f(x)=(1+x^2),编写函数用梯形法计算f(x)在区间[a,b]上的定积分 #includevoidmain(){doublei,j;doublea,b,c=0;printf( ...

  2. c语言如何乘分数,C语言分数相乘程序简化问题。

    C语言分数相乘程序简化问题. 答案:2  信息版本:手机版 解决时间 2019-10-03 09:30 已解决 2019-10-03 02:33 这是一个先输入分数个数n,回车后再分别输入分子和分母, ...

  3. c语言float输出分数,c语言同一题目求解结果用float和int输出值差1.

    c语言同一题目求解结果用float和int输出值差1. 答案:3  信息版本:手机版 解决时间 2018-12-08 22:35 已解决 2018-12-08 05:38 c语言同一题目求解结果用fl ...

  4. 用C语言计算超大乘法,C语言中超大整数乘法运算.docx

    C语言中超大整数乘法运算.docx .C 语言中超大整数乘法运算在计算机中,长整型 long int 变量的范围是 -2147483648 至 2147483647 ,因此若用长整型变量做乘法运算,乘 ...

  5. c语言计算24游戏,C语言解24点游戏程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 前几天在微博上看到24点的游戏,6 6 6 10.算了很久是在算不出来,最后我想我何不写一个小程序解决它?说做就做,我刚开始的想法很简单,就是列举4个数的 ...

  6. 用c语言计算高考成绩,C语言计算距离高考剩余时间

    每年6月6日定为高考,输入日期:xxxx.xx.xx,若没到6月6日,则算距离今年的,否则算明年的. #include #define uint unsigned int /*月份天数,1月31,2月 ...

  7. 复化梯形c语言计算定积分,第六章 函数和宏定义实验(2)

    1.利用复化梯形公式计算定积分 2.计算Ackerman函数 3.编写计算x的y次幂的递归函数getpower(int x,int y),并在主程序中实现输入输出 4.编写计算学生年龄的递归函数 5. ...

  8. 《Python自然语言处理》——1.1 语言计算:文本和词汇

    本节书摘来异步社区<Python自然语言处理>一书中的第1章,第1.1节,作者:[美]Steven Bird , Ewan Klein , Edward Loper,更多章节内容可以访问云 ...

  9. 《Python自然语言处理》——第1章 语言处理与Python 1.1 语言计算:文本和词汇...

    本节书摘来自异步社区<Python自然语言处理>一书中的第1章,第1.1节,作者[美]Steven Bird,Ewan Klein,Edward Loper, 陈涛,张旭,崔杨,刘海平 译 ...

最新文章

  1. 修改 jar 的一些体会
  2. debug 调试原理理解
  3. 服务器销售全国第一国内领先,浪潮服务器首季保持国内品牌第一
  4. linux视频教程之dhcp
  5. PMCAFF微课堂 | 腾讯搜索专家教你如何用数据玩转APP运营
  6. 删除前导0后缀0的几种方法
  7. java8 内存模型_java8内存模型
  8. Linux基础笔记1
  9. 中国超算世界第一 日本拟造最快超级计算机反超
  10. python源代码文件_Python代码编译与反编译
  11. python怎样定义font_无法在matplotlib中使用自定义字体
  12. 2019年中国研究生数学建模大赛的经验分享
  13. 研发工具之谷歌浏览器无法加载flash的问题
  14. 全球及中国钢铁行业投资产量趋势及营销盈利模式研究报告2021版
  15. 均匀分布的期望和方差的推导_均匀分布的期望和方差(D(X)与E(X)公式)
  16. BCM SIP ALG原理及实现(应用层实现机制)
  17. UE编辑器格式化java代码
  18. 乐学python视频资源_铁乐学python_day04-作业
  19. 工作展望简短_工作展望简短_时间2017工作展望
  20. r语言 网站数据查找

热门文章

  1. 森林怎么训练野人_森林游戏如何驯服野人
  2. 分享一个运维监控大屏看板
  3. 《Head First设计模式》读书笔记
  4. 视频教程-JavaScript+jQuery+项目实战系列视频教程-JavaScript
  5. java缩印_word文档如何缩印:如何使用记事本编写java程序
  6. 广东计算机一级网络操作题,计算机一级考试试题操作题及答案
  7. 2022下半年软件评测师真题评析
  8. 推荐三个非常有价值的公众号
  9. 天翼云智能边缘产品商用上线!
  10. Unity 模型顶点法线不统一————使用Blender修改顶点法线