C语言基础题(洛谷)
上学迟到问题
题目描述
学校和 yyy 的家之间的距离为 𝑠 米,而 yyy 以 𝑣 米每分钟的速度匀速走向学校。
在上学的路上,yyy 还要额外花费 10 分钟的时间进行垃圾分类。
学校要求必须在上午 8:00 到达,请计算在不迟到的前提下,yyy 最晚能什么时候出门。
由于路途遥远,yyy 可能不得不提前一点出发,但是提前的时间不会超过一天。
输入格式
一行两个正整数 𝑠,𝑣,分别代表路程和速度。
输出格式
输出一个 24 小时制下的时间,代表 yyy 最晚的出发时间。
输出格式为 HH:MM,分别代表该时间的时和分。必须输出两位,不足前面补 0。
输入输出样例
输入
100 99
输出
07:48
说明/提示
对于 100%的数据,1≤𝑠,𝑣≤1041≤s,v≤104。
1、错误代码:
#include<stdio.h>
#include<math.h>
int main()
{
int s, v, t, hour, minute;
scanf("%d%d", &s, &v);
t = 10 + ceil((double)s / v); //ceil函数的返回值是double类型的
hour = 8 - t / 60; // 8点要拆成7:60,所以应把8改成7
minute = 60 - (t - hour * 60); //应用hour%60来算分钟数
// 没有考虑到hour < 0的情况
printf("%2d:%2d", hour, minute); // %2d是在不够的位置上补空格,%02才代表补零
return 0;
}
2、正确代码:
代码如下(示例1):
#include<stdio.h>
#include<math.h>
int main()
{
int s, v, t, hour, minute;
scanf("%d%d", &s, &v);
t = 10 + (int)ceil((double)s / v);
// 使用ceil函数向上取整,确保即使有余数也会增加到下一分钟
hour = 7 - t / 60;
// 计算小时数,7代表7点,因为学校要求8点到达,所以从8点向前推算
// t / 60得到的是总小时数,减去7得到需要提前的小时数
minute = 60 - t % 60;
// 计算分钟数,t % 60得到的是不足一小时的分钟数
// 由于我们已经从7点减去了完整的小时数,所以这里用60减去剩余的分钟数
if (hour < 0)
hour += 24;
// 如果计算出的小时数小于0,说明出发时间是前一天
// 因此,将小时数加上24,转换为前一天的时间
printf("%02d:%02d", hour, minute);
// 按照24小时制格式化输出时间,%02d确保输出的数字至少有两位,不足的前面补0
return 0;
}
代码如下(示例2):
#include<stdio.h>
#include<math.h>
int main()
{
int s, v;
scanf("%d %d", &s, &v);
int t = ceil(s * 1.0 / v) + 10; // 计算 s 除以 v 的结果,由于乘以 1.0,这里进行的是浮点数除法。ceil 函数用于将结果向上取整,然后加上 10,得到整数 t。
int end = 8 * 60; // 定义整数 end,表示一天中的结束时间,即 8 点整(8 小时 * 60 分钟)。
int start = end - t; // 计算 start 时间,即从 end 时间减去之前计算的 t 时间。
if (start < 0) // 如果 start 时间小于 0,说明计算出的时间在前一天。
start += 24 * 60; // 将 start 时间加上一天的分钟数(24 小时 * 60 分钟),使其变为正数。
printf("%02d:%02d", start / 60, start % 60); // 输出 start 时间,格式化为小时和分钟。%02d 确保了输出至少两位数,如果不足两位则在前面补零,分别输出小时数和分钟数。
return 0;
}
3、简洁版
1.
#include<stdio.h>
#include<math.h>
int main()
{
int s, v, t, hour, minute;
scanf("%d%d", &s, &v);
t = 10 + (int)ceil((double)s / v);
hour = 7 - t / 60;
minute = 60 - t % 60;
if (hour < 0)
hour += 24;
printf("%02d:%02d", hour, minute);
return 0;
}
2.
#include<stdio.h>
#include<math.h>
int main()
{
int s, v;
scanf("%d %d", &s, &v);
int t = ceil(s * 1.0 / v) + 10;
int end = 8 * 60;
int start = end - t;
if (start < 0)
start += 24 * 60;
printf("%02d:%02d", start / 60, start % 60);
}
总结
1.ceil函数返回值为double类型
2.t%60即可得到分钟数
3.小时为非负数,可用 hour += 24 调整
4.%02d确保输出的数字至少有两位,不足的前面补0