GESP2026年9月认证C++一级( 第三部分编程题(1、新龟兔赛跑))精讲


一、先听懂故事:新龟兔赛跑 🐢🐇

很久很久以前......

兔子和乌龟进行了一场赛跑。

以前兔子因为骄傲自满,比赛的时候睡觉,输给了乌龟。

这一次兔子吸取了教训:

"这次我绝对不睡觉!"

所以:

  • 🐢 乌龟会一直按照固定速度跑到终点;

  • 🐇 兔子不会再睡觉,但是它会在终点前睡一会儿;

  • 谁先到达终点,谁就获胜。

题目给我们三个数字:

复制代码
第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判断 → 格式化输出这一整条链路连接起来。


相关推荐
沫璃染墨1 小时前
《从零入门Linux系统篇(五十七):线程篇·十——生产者消费者模型进阶:从环形缓冲区到POSIX信号量》
linux·运维·服务器·开发语言·c++·系统架构·信号处理
wuminyu1 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
知识分享小能手2 小时前
C++ 学习教程,从入门到精通,string类和标准模板库 — 完整知识点详解(16)
开发语言·c++·学习
无忧.芙桃2 小时前
位图妙用:512MB 实现 40 亿整数的存在性查询
c语言·c++·面试·哈希算法
ShineWinsu2 小时前
对于Redis:Steam、Geospatial、Hyperloglog、Bitmap、Bitfield类型的解析
数据库·c++·redis·分布式·缓存·面试·zset
朝朝辞暮i3 小时前
C++ 第 31C 课:Subscriber 到底是什么
开发语言·c++·算法
殷色玫瑰3 小时前
C++ string类详解:常用接口、字符串操作与模拟实现
java·linux·c语言·开发语言·数据结构·c++
李游Leo3 小时前
HarmonyOS 7 + Spatial Recon Kit-C++:3DGS 高斯参数的非有限值隔离与可渲染性门禁【鸿蒙心迹】
开发语言·c++·3d·harmonyos
jimy14 小时前
基类没有虚析构函数,基类指针删除派生类对象,行为是未定义的
开发语言·c++