c语言计算跳水分数,C语言判断五位选手跳水名次
有这样一个问题: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语言判断五位选手跳水名次相关推荐
- C语言计算级数fun,c语言编程 编写函数fun(),它的功能是:计算和输出下列级数的和....
用C语言编程,已知f(x)=(1+x^2),编写函数用梯形法计算f(x)在区间[a,b]上的定积分 #includevoidmain(){doublei,j;doublea,b,c=0;printf( ...
- c语言如何乘分数,C语言分数相乘程序简化问题。
C语言分数相乘程序简化问题. 答案:2 信息版本:手机版 解决时间 2019-10-03 09:30 已解决 2019-10-03 02:33 这是一个先输入分数个数n,回车后再分别输入分子和分母, ...
- c语言float输出分数,c语言同一题目求解结果用float和int输出值差1.
c语言同一题目求解结果用float和int输出值差1. 答案:3 信息版本:手机版 解决时间 2018-12-08 22:35 已解决 2018-12-08 05:38 c语言同一题目求解结果用fl ...
- 用C语言计算超大乘法,C语言中超大整数乘法运算.docx
C语言中超大整数乘法运算.docx .C 语言中超大整数乘法运算在计算机中,长整型 long int 变量的范围是 -2147483648 至 2147483647 ,因此若用长整型变量做乘法运算,乘 ...
- c语言计算24游戏,C语言解24点游戏程序
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 前几天在微博上看到24点的游戏,6 6 6 10.算了很久是在算不出来,最后我想我何不写一个小程序解决它?说做就做,我刚开始的想法很简单,就是列举4个数的 ...
- 用c语言计算高考成绩,C语言计算距离高考剩余时间
每年6月6日定为高考,输入日期:xxxx.xx.xx,若没到6月6日,则算距离今年的,否则算明年的. #include #define uint unsigned int /*月份天数,1月31,2月 ...
- 复化梯形c语言计算定积分,第六章 函数和宏定义实验(2)
1.利用复化梯形公式计算定积分 2.计算Ackerman函数 3.编写计算x的y次幂的递归函数getpower(int x,int y),并在主程序中实现输入输出 4.编写计算学生年龄的递归函数 5. ...
- 《Python自然语言处理》——1.1 语言计算:文本和词汇
本节书摘来异步社区<Python自然语言处理>一书中的第1章,第1.1节,作者:[美]Steven Bird , Ewan Klein , Edward Loper,更多章节内容可以访问云 ...
- 《Python自然语言处理》——第1章 语言处理与Python 1.1 语言计算:文本和词汇...
本节书摘来自异步社区<Python自然语言处理>一书中的第1章,第1.1节,作者[美]Steven Bird,Ewan Klein,Edward Loper, 陈涛,张旭,崔杨,刘海平 译 ...
最新文章
- 修改 jar 的一些体会
- debug 调试原理理解
- 服务器销售全国第一国内领先,浪潮服务器首季保持国内品牌第一
- linux视频教程之dhcp
- PMCAFF微课堂 | 腾讯搜索专家教你如何用数据玩转APP运营
- 删除前导0后缀0的几种方法
- java8 内存模型_java8内存模型
- Linux基础笔记1
- 中国超算世界第一 日本拟造最快超级计算机反超
- python源代码文件_Python代码编译与反编译
- python怎样定义font_无法在matplotlib中使用自定义字体
- 2019年中国研究生数学建模大赛的经验分享
- 研发工具之谷歌浏览器无法加载flash的问题
- 全球及中国钢铁行业投资产量趋势及营销盈利模式研究报告2021版
- 均匀分布的期望和方差的推导_均匀分布的期望和方差(D(X)与E(X)公式)
- BCM SIP ALG原理及实现(应用层实现机制)
- UE编辑器格式化java代码
- 乐学python视频资源_铁乐学python_day04-作业
- 工作展望简短_工作展望简短_时间2017工作展望
- r语言 网站数据查找