C语言习题
来源:互联网 发布:windows系统原理 编辑:程序博客网 时间:2024/04/24 19:14
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第一,我第三。
B选手说:我第二,E第四。
C选手说:我第一,D第二。
D选手说:C最后,我第三。
E选手说:我第四,A第一。
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
要判断这五个人的名次,首先先列出所有可能,这里就需要用5 个循环了。
接下来就是判断每位选手都说对了一半。
#include <stdio.h>int main(){ int a=0,b=0,c=0,d=0,e=0; for(a=1;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(((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); } } } } } } return 0;}
if里面是判断名词的条件,因为每位选手都只说对了一半,所以就用加法来筛选,只有1+0或是0+1才等于1。又因为每位选手都一定有一句话是对的,这里就需要&了,&的意思是按位与,只有每个条件都正确,结果才能为1,若是采用加号,那么就有可能出现2+0=2的情况,这里必须是1+1=2。
若是在此时运行程序,那么还是会有很多的结果,那么我们就在需要一次筛选了,选出那些名次中有一个或几个是空缺的。
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)) { int num=0; num |=1<<(a-1); num |=1<<(b-1); num |=1<<(c-1); num |=1<<(d-1); num |=1<<(e-1); while(num>0) { if(num%2==0) break; num /=2; } if(num==0) printf("A是第%d名,B是第%d名,C是第%d名,D是第%d名,E是第%d名\n",a,b,c,d,e); }
如果a的名词是第一名,就将1向左移动一位的值赋给num,再将 num与之前的num按位或,
例如如果排名是1,2,3,4,5
那么最后的num是11111
如果其中有一个名次没有出现,那么num会变成11011,或10111或是其他的可能。
这时再判断一次,把num除2取余,若是等于0,那就代表名词不连续,那么就break,直到名次连续,这时的num=0,就可以输出了。
0 0
- C语言试卷习题
- C语言习题1
- c语言习题
- c语言习题
- c语言习题
- C语言习题
- C语言习题整理
- c语言习题
- C语言习题练习
- C语言习题
- c语言学习习题
- C语言习题一
- C语言习题二
- C语言习题三
- C语言习题四
- C语言习题六
- C语言习题
- C语言习题6
- 2016/10/23
- Linux -- 进程间通信之信号量
- struts2文件上传突破2M大小限制的问题
- 自考宏观回顾
- Linux C/C++ 内存泄漏检测工具:Valgrind
- C语言习题
- Canada Cup 2016-D. Contest Balloons(优先队列)
- Swift 3 新特性
- php中0与空的区别
- Android软键盘总结
- 贵阳重庆两日往返游计划书
- bootstrap学习总结-js组件
- Dom4j 解析XML
- 利用apache的poi来读取海量两种格式的Excel文件