7-2 然后是几点

7-2 然后是几点

分数 15
作者 翁恺
单位 浙江大学
有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。

读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。

输入格式:
输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 5 点 30 分表示为 530;0 点 30 分表示为 030。流逝的分钟数可能超过 60,也可能是负数。

输出格式:

输出不多于四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。

输入样例:

1120 110

输出样例:

1310
鸣谢燕山大学穆运峰老师、用户任钰补充数据!

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

解题思路

第一步接收用户数据
这里我们用一个字符数组进行接收方便统计位数,然后计算出小时和分钟存入两个变量中。

第二步编写一个函数处理进位
其中,题目给定的流逝时间可以是正数也可是负数,所以我们分两大类,一种是时间正向流逝,一种是时间倒退推算。

正向流逝
这里较为简单,分钟数逢60对小时数进位即可。

倒退推算
此时又分进位和不进位的情况,不进位较为简单,直接用原分钟数m减去流逝时间minute即可,下面重点说一下进位情况:
因为流逝时间为负数,所以称为倒退推算,那么当原分钟数加上流逝时间小于0的时候则需要进位操作,此时不能按“正向流逝”的进位方法来操作,需要引进一个补位系数b。
假设当前时间为002,代表00:02点,流逝时间为-65,因为-65+2+60<0,所以 -65(-1)/60 =1.08333...,向上取整,则补位系数为2,有了补位系数我们现在求进位后的分钟数m就简单了,原分钟数 + 流逝分钟数 + 60*补位系数,按这个公式求出进位后的分钟数m = 2+(-65)+602 = 57,进位后得分钟数为57,小时数则为h -= (-65)*(-1)/60 = 1.08333...,将商进行向下取整h-1 = -1,此时进位后的时间为:-1:57,接着下一步。

处理时间进制问题
统一处理小时数小于0或者小时数大于23,例如上面的-1:57。这里我们将小于0的统一加24,大于23统一减去24即可,-1:57的小时数加上24最终结果为23:57

处理前导零和尾部补零的情况
最后我们打印的时候需要注意,当小时和分钟全部为0的时候,由于我们是使用int存入的小时和分钟,那么这里我们需要对全0的情况进行不满三位补零。

代码实现

#include<stdio.h>
#include<string.h>
#include<math.h>
void handle(int* h, int* m, int minute) {
	float temp;
	int b;
	//  时间正向流逝
	if (minute >= 0) {
		*m += minute;
		*h += *m / 60;
		*m %= 60;
	}
	//  时间逆运算
	else {
		//  处理进位
		if (minute + *m < 0)
		{
			temp = (-minute) / 60.0;
			b = (int)ceil(temp);

			*m = *m + minute + b * 60;
			*h -= (*m + minute * (-1)) / 60;

		//  处理不进位
		}
		else {
			*m += minute;
		}
	}
	// 处理时间进制问题
	if (*h < 0)
		*h += 24;
	else if (*h >= 24)
		*h -= 24;
}

int main() {
	int h, num, m;
	char msg[4] = { 0 };
	scanf("%s %d", msg, &num);

	if (strlen(msg) == 4)
	{
		h = (msg[0] - '0') * 10 + msg[1] - '0';
		m = (msg[2] - '0') * 10 + msg[3] - '0';
	}
	else if (strlen(msg) == 3)
	{
		h = (msg[0] - '0');
		m = (msg[1] - '0') * 10 + msg[2] - '0';
	}

	handle(&h, &m, num);

	// 处理前导零和尾部补零的情况。
	printf("%02d%02d", h, m);

	return 0;
}
posted @ 2022-11-19 02:04  蠢蛋快跑  阅读(242)  评论(0)    收藏  举报