【C语言每日一题】—— 猜名次😎😎😎
💡前言🌞:
💛猜名次题目💛
💪 解题思路的分享💪
😊题目源码的分享😊
👉 本菜鸡&总结 👈
😎博客昵称:陈大大陈
😊座右铭:所谓觉悟,就是在漆黑的荒野上开辟出一条理当前进的光明大道。
😋博主简介:一名热爱C/C++和算法等技术,喜欢运动,爱胡思乱想却胸怀大志的小博主!
😚博主&唠嗑:早中晚安!😄各位CSDN的朋友!😄我是博客新人陈大大陈,希望我的文章能为你带来帮助!欢迎大家在评论区畅所欲言!也希望大家多多为我提出您宝贵的建议!😘如果觉得我写的不错的话还请点个赞和关注哦~😘😘😘
💡前言🌞:
大伙们好!😄又到了小陈每日一题的时间了~ 😋😋😋今天也带来了十分有趣的题目!🥰🥰🥰用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语言每日一题】——猜名次。🤠希望我的文章能够让大家有所收获!🙋♂️我的方法只是很暴力的五重循环,效率很低,如果有路过的大佬看到的话,还请不吝赐教!😀😀😀大佬们如果对我的文章有什么建议,或者认为那里写的不好,请在评论区写下您宝贵的意见!😀如果觉得我写的不错的话还请点个赞和关注哦~我会持续输出编程的知识的!🌞🌞🌞