






一、先听懂故事:新龟兔赛跑 🐢🐇
很久很久以前……
兔子和乌龟进行了一场赛跑。
以前兔子因为骄傲自满,比赛的时候睡觉,输给了乌龟。
这一次兔子吸取了教训:
“这次我绝对不睡觉!”
所以:
-
🐢 乌龟会一直按照固定速度跑到终点;
-
🐇 兔子不会再睡觉,但是它会在终点前睡一会儿;
-
谁先到达终点,谁就获胜。
题目给我们三个数字:
第1行:乌龟从起点到终点需要的时间
第2行:兔子的速度
第3行:兔子在终点前睡觉的时间
起点到终点的距离固定为:
1000.0
题目要求我们判断:
乌龟赢?
兔子赢?
还是平局?
并且第二行输出:
兔子到达终点所需要的总时间。
二、第一件事情:先把题目转换成“数学语言”
假设输入:
20.0
100.0
11.0
那么:
乌龟时间 = 20.0
兔子速度 = 100.0
兔子睡觉时间 = 11.0
兔子跑的距离是:
1000.0
我们知道:
⭐ 时间 = 路程 ÷ 速度
所以兔子不停下来跑完全程需要:
1000.0 ÷ 100.0
= 10.0
但是!
兔子还要睡:
11.0
所以兔子的总时间:
10.0 + 11.0
= 21.0
于是:
🐢 乌龟:20.0
🐇 兔子:21.0
谁更快?
当然是:
20.0 < 21.0
所以:
🐢 乌龟获胜!
题目的样例输出正是:
turtle
21.00
三、这道题真正的核心只有两个步骤
我们可以把整个题目压缩成一张“藏宝图”:
输入
↓
┌─────────────────┐
│ 乌龟需要的时间 t1 │
│ 兔子的速度 v │
│ 兔子睡觉时间 t2 │
└─────────────────┘
↓
计算兔子跑步时间
↓
1000.0 / v
↓
加上兔子的睡觉时间
↓
兔子总时间 tt
↓
┌────────┼────────┐
↓ ↓ ↓
tt < t1 tt > t1 tt == t1
↓ ↓ ↓
rabbit turtle tie
是不是一下就简单了?
四、第一步:定义三个变量
我们可以写:
float t1, v, t2;
分别表示:
t1 → 乌龟需要的时间
v → 兔子的速度
t2 → 兔子睡觉的时间
为什么使用:
float
而不是:
int
因为题目的数据可能是:
20.0
100.0
11.0
也就是说:
可能有小数。
所以我们使用能够保存小数的 float。
五、第二步:输入数据
代码:
cin >> t1 >> v >> t2;
如果输入:
20.0
100.0
11.0
那么:
t1 = 20.0
v = 100.0
t2 = 11.0
可以想象成三个小盒子:
┌────────────┐
│ t1 = 20.0 │ 🐢
└────────────┘
┌────────────┐
│ v = 100.0 │ 🐇
└────────────┘
┌────────────┐
│ t2 = 11.0 │ 😴
└────────────┘
六、第三步:计算兔子的总时间
这是全题最重要的一行:
float tt = 1000.0 / v + t2;
我们拆开来看。
① 1000.0 / v
这是:
兔子跑完整个1000米需要的时间。
因为:
时间 = 路程 ÷ 速度
所以:
1000.0 ÷ v
② + t2
兔子跑完以后还需要加上:
睡觉时间
所以:
兔子总时间
=
跑步时间
+
睡觉时间
也就是:
float tt = 1000.0 / v + t2;
七、拿样例走一遍
输入:
20.0
100.0
11.0
先计算:
1000.0 / 100.0
= 10.0
再加:
10.0 + 11.0
= 21.0
所以:
tt = 21.0
八、第四步:比较谁先到达
现在我们有:
t1 = 乌龟时间
tt = 兔子时间
所以直接比较:
if (tt < t1)
什么意思?
如果兔子用的时间更少,兔子获胜。
那么:
printf("rabbit\\n");
第二种情况
如果:
else if (tt > t1)
说明:
兔子需要更多时间。
所以:
🐢 乌龟更快
输出:
printf("turtle\\n");
第三种情况
如果:
else
意味着:
tt == t1
也就是:
两个人恰好同时到达!
所以:
printf("tie\\n");
九、把整个判断画成“比赛终点门”
可以把它想象成终点有一个裁判:
🏁 终点裁判
│
┌────────┴────────┐
│ │
兔子时间 tt 乌龟时间 t1
│ │
└────────┬────────┘
↓
比较时间
↓
┌───────────┼───────────┐
↓ ↓ ↓
tt<t1 tt>t1 tt=t1
↓ ↓ ↓
rabbit turtle tie
记住:
比赛比的是“时间”,不是速度!
这是这道题非常容易出现的思维陷阱。
十、为什么不能直接比较兔子的速度和乌龟?
比如:
乌龟时间:20秒
兔子速度:100
兔子睡觉:11秒
我们不能说:
“兔子的速度100,看起来一定比乌龟快。”
因为乌龟给我们的不是速度,而是:
乌龟已经跑完全程需要20秒。
而兔子需要我们自己计算:
1000 / 100 + 11
= 21
最后比较:
20秒 vs 21秒
所以:
🐢 乌龟赢。
十一、第二个样例:兔子赢了 🐇
题目第二组输入:
20.0
100.0
9.0
我们计算:
兔子跑步时间:
1000 ÷ 100
= 10
兔子睡觉:
9
所以:
兔子总时间
= 10 + 9
= 19
乌龟:
20
比较:
19 < 20
所以:
🐇 兔子获胜!
输出:
rabbit
19.00
十二、为什么输出是 19.00,而不是 19?
这个地方很值得初学者注意。
题目要求输出二位小数。
参考程序:
printf("%.2f\\n", tt);
这里:
%.2f
就是:
用小数形式输出,并且保留2位小数。
所以:
19
会显示成:
19.00
而:
21
会显示成:
21.00
十三、%.2f到底是什么意思?
把它拆成:
%
.2
f
f
表示:
按浮点数格式输出。
.2
表示:
小数点后保留2位。
所以:
printf("%.2f", 19.5);
输出:
19.50
而:
printf("%.2f", 19.567);
会按照两位小数的要求输出相应结果。
十四、完整参考程序
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
float t1, v, t2;
cin >> t1 >> v >> t2;
float tt = 1000.0 / v + t2;
if (tt < t1)
printf("rabbit\\n");
else if (tt > t1)
printf("turtle\\n");
else
printf("tie\\n");
printf("%.2f\\n", tt);
return 0;
}
这也是这道题的核心程序结构。
十五、我们逐行解析
#include <iostream>
#include <cstdio>
↓
📚 我要使用输入输出工具。
using namespace std;
↓
后面的代码可以直接使用 cin 等名字。
int main()
↓
🎬 比赛正式开始!
float t1, v, t2;
↓
准备三个小盒子:
🐢 乌龟时间
🐇 兔子速度
😴 兔子睡觉时间
cin >> t1 >> v >> t2;
↓
把输入的数据装进三个盒子。
float tt = 1000.0 / v + t2;
↓
计算兔子的总时间。
if (tt < t1)
↓
兔子时间更短吗?
如果是:
printf("rabbit\\n");
↓
🐇 兔子赢!
else if (tt > t1)
↓
兔子时间更长吗?
如果是:
printf("turtle\\n");
↓
🐢 乌龟赢!
else
↓
两个人时间一样!
printf("tie\\n");
↓
🤝 平局!
printf("%.2f\\n", tt);
↓
把兔子的总时间保留两位小数打印出来。
十六、这道题最重要的“做题模板”
以后大家再遇到类似的:
两个人比赛,谁先到达?
可以直接使用这个思考模板:
第1步:分别确定两个人的时间
人物A时间 = ?
人物B时间 = ?
第2步:如果某个人没有直接给时间
利用:
时间 = 路程 ÷ 速度
第3步:把额外花费的时间加进去
例如:
总时间 = 跑步时间 + 睡觉时间
第4步:比较时间
A时间 < B时间 → A赢
A时间 > B时间 → B赢
A时间 == B时间 → 平局
十七、初学者容易犯的4个错误
❌ 错误1:把速度当成时间比较
兔子的速度是 100,不能直接和乌龟的 20 比。
因为:
100 → 速度
20 → 时间
单位都不一样。
❌ 错误2:忘记兔子睡觉
兔子真正的总时间:
1000 / v + t2
而不是:
1000 / v
❌ 错误3:把公式写反
错误:
v / 1000
正确:
1000.0 / v
因为:
时间 = 路程 ÷ 速度
❌ 错误4:忘记平局
不能只写:
if (tt < t1)
rabbit
else
turtle
因为还有第三种可能:
tt == t1
所以应该:
if (tt < t1)
rabbit;
else if (tt > t1)
turtle;
else
tie;
十八、最后把这道题压缩成一句话
🐢 乌龟时间题目直接给,兔子时间用“1000÷速度+睡觉时间”算出来,然后谁的时间短谁获胜。
最后形成一个思维方式流程:
读题
↓
找变量
↓
找公式
↓
算出兔子时间
↓
if 比较
↙ ↓ ↘
兔赢 平局 龟赢
这道题的算法难度不高,真正考查的是孩子能不能把故事 → 数学公式 → C++变量 → if-else判断 → 格式化输出这一整条链路连接起来。
网硕互联帮助中心

![C++入门篇(十):string(上)——认识string:构造与三大遍历(一条龙讲透operator[]、迭代器、auto、范围for)-网硕互联帮助中心](https://www.wsisp.com/helps/wp-content/uploads/2026/10/20261001032318-6abdd226d398f.png)

评论前必须登录!
注册