【C语言基础】上学迟到类时间计算

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值