c语言 龟兔赛跑

龟兔赛跑

问题描述
  话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上,它们就会停下来休息s秒。对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。
  然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度v1(表示每秒兔子能跑v1米),乌龟的速度v2,以及兔子对应的t,s值,以及赛道的长度l——就能预测出比赛的结果。但是小华很懒,不想通过手工计算推测出比赛的结果,于是他找到了你——清华大学计算机系的高才生——请求帮助,请你写一个程序,对于输入的一场比赛的数据v1,v2,t,s,l,预测该场比赛的结果。
输入格式
  输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l,其中(v1,v2<=100;t<=300;s<=10;l<=10000且为v1,v2的公倍数)
输出格式
  输出包含两行,第一行输出比赛结果——一个大写字母“T”或“R”或“D”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。
  第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。
样例输入
10 5 5 2 20
样例输出
D
4
样例输入
10 5 5 1 20
样例输出
R
3
样例输入
10 5 5 3 20
样例输出
T
4

问题分析:,

当第一眼看到这个问题的时候,可能会被过多的变量,和不断变化的赛跑过程给弄得晕头转向,
所以在这里,我们理一下本题思路:

	1,明白相关变量的含义,比如:
			t--兔子领先米数,s--停下休息秒数,l--赛道长度,v1--兔子速度,v2--乌龟速度
			
	2,明白,当有一方 路程s1,s2 大于l 时,输出结果
			
			判断条件:
					while(s1<l && s2<l)
			输出结果:
					if (s1>s2)      printf("R\n");
					else if (s2>s1) printf("T\n");
					else		   printf("D\n");
					
	3,每秒兔子和乌龟的路程数都会增加,同时秒数增加
					s1 += v1;
					s2 += v2;
					i++;
					
	4,当兔子的路程大于乌龟 t 米后,停下来休息
		if (s1 - s2 >= t)
		s1 -= v1*s;	// 核心:以乌龟的不变的速度为标准  减去休息时少跑的路程
		
	5,注意跳出while 的条件
			a,	while(s1<l && s2<l)
			b,	if (s1 == l || s2 == l)
				break;
				
	6,根据分析,写出代码

代码展示(已验证):

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) 
{
	int v1, v2, t, s, l, s1 = 0, s2 = 0, i = 0;	//相关变量已经在题目中定义
	scanf("%d %d %d %d %d", &v1, &v2, &t, &s, &l);
	
	while (s1<l && s2<l)
	{
		s1 += v1;
		s2 += v2;
		i++;
		if (s1 == l || s2 == l)
			break;
		if (s1 - s2 >= t)
			s1 -= v1*s;	// (记住乌龟的不变速度)  减去休息时少跑的路程
	}
	// 输出结果
	if (s1>s2)      printf("R\n");
	else if (s2>s1) printf("T\n");
	else		   printf("D\n");
	
	printf("%d", i);	//输出 秒数

	return 0;	
}

泡泡:

	龟兔赛跑的动态变化的过程,想的太多,会很头疼,用 while 拿捏整个赛跑过程,写好跳出 while 的条件,
也就相当于有了一个正确的结束,当结束是正确的,那么进行过程的代码描述:
			
				路程的相加
				秒数相加
				是否等于赛道长度
				是否超过乌龟 t 米
当while 结束,就可以根据 s1,s2 的大小判断,进行输出了

ok ,收工。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值