💡前言🌞:
大伙们好!😄又到了小陈每日一题的时间了~ 😋😋😋今天也带来了十分有趣的题目!🥰🥰🥰用C语言实现——猜名次~这个题目很有意思,新颖的同时又很值得思考!我现在迫不及待地要和大家分享~!😄🤗🤗
💛猜名次题目💛
💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡💡
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
💪 解题思路的分享💪
考虑到一共五个人,直接模拟推理有些太难,计算机最擅长的遍历此时就会派上用场,将每个人从第1到第5来一遍,则一共会产生5^5种可能性。
我们只需要写出一个五重的循环就能搞定它,对于这道题目而言,循环可以轻易地遍历所有结果。
仔细阅读题目,将五人的话分别化为条件项写在 if() 语句中,即可写出代码。
但是我们这样单纯的循环并不能够完美地解决问题,可能会出现重复的情况,即出现了两个第二名,或者3个第四名这样的情况。
为了避免出现这样的情况,我们要加入条件语句来筛选,查看在满足条件的情况下名次是否重复,用if语句来将重复的情况筛选掉即可。
😊题目源码的分享😊
#include <stdio.h> int checkData(int *p) { int tmp[7] = { 0 }; int i; for (i = 0; i < 5; i++) { if (tmp[p[i]]) //如果这个位置的标记已经是1,则代表重复,返回0。 { return 0; } tmp[p[i]] = 1; //如果不是,则将这个位置标记为1。 } return 1; //如果全部标记完毕也没有出现重复的情况,代表OK。 } int main() { int p[5]; //0 1 2 3 4分别代表a b c d e for (p[0] = 1; p[0] <= 5; p[0]++) { for (p[1] = 1; p[1] <= 5; p[1]++) { for (p[2] = 1; p[2] <= 5; p[2]++) { for (p[3] = 1; p[3] <= 5; p[3]++) { for (p[4] = 1; p[4] <= 5; p[4]++) //五层循环遍历 { //这是五个人的描述,比较表达式只有0和1两个结果,如果要两个条件有且只有一个为真,则可以用比较表达式的值总和为1的方式直接判定。别忘了还要判定不能并列。 if ((p[1] == 2) + (p[0] == 3) == 1 && //B第二,我第三 (p[1] == 2) + (p[4] == 4) == 1 && //我第二,E第四 (p[2] == 1) + (p[3] == 2) == 1 && //我第一,D第二 (p[2] == 5) + (p[3] == 3) == 1 && //C最后,我第三 (p[4] == 4) + (p[0] == 1) == 1 && //我第四,A第一 checkData(p) //不能并列 ) { for (int i = 0; i < 5; i++) { printf("%d ", p[i]); } printf('\n'); } } } } } } return 0; }
👉 本菜鸡&总结 👈
本篇文章旨在分享C语言详解【C语言每日一题】——猜名次。🤠希望我的文章能够让大家有所收获!🙋♂️我的方法只是很暴力的五重循环,效率很低,如果有路过的大佬看到的话,还请不吝赐教!😀😀😀大佬们如果对我的文章有什么建议,或者认为那里写的不好,请在评论区写下您宝贵的意见!😀如果觉得我写的不错的话还请点个赞和关注哦~我会持续输出编程的知识的!🌞🌞🌞