上学迟到
一道很简单的题,但确实容易踩坑,不过只要思路清晰就能规避,这里我通过对选择结构的运用,来提供一种思路简单又清晰的解题方法。
题目描述
学校和 yyy 的家之间的距离为 s 米,而 yyy 以 v 米每分钟的速度匀速走向学校。
在上学的路上,yyy 还要额外花费 10 分钟的时间进行垃圾分类。
学校要求必须在上午 8:00 到达,请计算在不迟到的前提下,yyy 最晚能什么时候出门。
由于路途遥远,yyy 可能不得不提前一点出发,但是提前的时间不会超过一天。
输入格式
一行两个正整数 s,v,分别代表路程和速度。
输出格式
输出一个 24 小时制下的时间,代表 yyy 最晚的出发时间。
输出格式为 HH:MM,分别代表该时间的时和分。必须输出两位,不足前面补 0。
输入输出样例
输入 #1
100 99
输出 #1
07:48
注意
1.不要忘记进行垃圾分类要花的10分钟
2.注意观察输入和输出样例,根据题目要求,走路所需时间应为99/100=1.01(分钟),而输出样例却表示走路花了2分钟,说明走路所需时间要向上取整,有如下两种方案
(1)利用选择结构,若s%v!=0,则所需时间+1
if(s%v!=0)
{
time = s/v+1+10;
}else
{
time = s/v+10;
}
(2)利用ceil函数进行向上取整(不要忘记调用math.h哦),如果我们给s和v定义的类型是int的话,还要注意格式的转换
time = ceil(s*1.0/v)+10;
若只是s/v,ceil函数括号里面就取的是一个整数,这还怎么向上取整呀,这里给s乘上一个1.0,通过自动类型转换,括号内取得的是一个小数,就向上取整啦,否则ceil(100/99)还是1,而不是我们所想要的2了
3.时间不足两位的时候要补零,而且是时和分都要补零,还要注意整点时的输出(我刚开始只给小时补零了,就一直出错)
4.有可能会提前一天出发
思路
先算出要提前多久,然后计算出发时间
为了方便计算,我们把8:00转化为分钟制,8*60=480,同时因为有可能提前一天出发,干脆再加24*60分钟
这样的好处是,如果真的要提前一天出发的话,直接用8*60+24*60减去要提前的时间,就直接得到了前一天出发时间的分钟制,如果不用提前一天走,还要减去那多加的24个小时,就得到了当天出发时间的分钟制
接下来就很简单啦
int schooltime = (24+8)*60;
gotime = schooltime - time;
if(time<8*60)//不需要提前一天走的情况下
{
gotime -= 24*60;
}
int h = gotime/60;
int m = gotime%60;
之后通过一个选择结构控制一下输出就可以了,完整代码如下
#include<stdio.h>
int main()
{
int s,v;
scanf("%d %d",&s,&v);
int schooltime = (24+8)*60;
int time;
if(s%v!=0)//计算需要提前的时间
{
time = s/v+1+10;
}else
{
time = s/v+10;
}
int gotime = schooltime - time;//计算出发时间的分钟制
if(time<8*60)
{
gotime -= 24*60;
}
int h = gotime/60;//转化为24小时制
int m = gotime%60;
if(h<10)//对结果进行输出,先输出小时,再输出分钟,这样更清晰
{
printf("0%d:",h);//不足两位用零补位
}else
{
printf("%d:",h);
}
if(m<10)
{
printf("0%d",m);//若m=0,输出的是00,就不用担心整点的问题了
}else
{
printf("%d",m);
}
return 0;
}