目录
题目描述
思考:
源代码
运行结果
优化
来看运行结果
题目描述
A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些人参加了竞赛:
(1)A参加时,B也参加;
(2)B和C只有一个人参加;
(3)C和D或者都参加,或者都不参加;
(4)D和E中至少有一个人参加;
(5)如果E参加,那么A和D也都参加。
思考:
参加和不参加是两种互斥的情况,可以用1表示参加,用0表示不参加;
要逐个判断是否参加,干脆用循环;
在循环里嵌套if语句,对应五个条件;
最后输出计算结果;
源代码
废话不多说,上代码!
#include<stdio.h>int main(){int a=0,b=0,c=0,d=0,e=0;for(a=0; a<2; a++) for(b=0; b<2; b++) for(c=0; c<2; c++) for(d=0; d<2; d++)for(e=0; e<2; e++){if(1==a && 0==b)break;else if(b==c)break;else if(c!=d)break;else if(0==d&&0==e)break;else if(1==e&&(0==a||0==d))break;goto here;}here:printf("%d%d%d%d%d\n", a,b,c,d,e);return 0;}
嵌套的for循环确保所有参赛组合都参与计算;
五个if()中是不符合题意的组合类型,我称为“筛选”,最后筛选出来之后得到的就是符合题意的组合类型,只剩一步,输出就行;
运行结果
优化
不用goto语句,如何跳出整整5重for循环呢?好像也是有办法的🤔
#include<stdio.h>int main(){int a=0,b=0,c=0,d=0,e=0;for(a=0; a<2; a++)for(b=0; b<2; b++)for(c=0; c<2; c++)for(d=0; d<2; d++)for(e=0; e<2; e++){if(a && !b)break;else if(b==c)break;else if(c!=d)break;else if(!d&&!e)break;else if(e&&(!a||!d))break;printf("%d%d%d%d%d\n", a,b,c,d,e);return 0;}}
直接在打印完参赛者名单后return 0;
顺便简化一下循环条件的书写:
a=1; "!"是取反符号;
if(a) ------------------------ if(a==1)
if(!a) ------------------------ if(a==0)
另外,关于&&和||的优先级:
c语言保证&&和||的求值顺序是从左到右
所以第5个if条件里要给条件或先加括号啦~