#t31. 时间计算问题

时间计算问题

时间计算问题

题目描述

有时候人们用四位数字表示一个时间,比如 11061106 表示 1111 点零 66 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。

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

输入格式

输入在一行中给出 22 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 55 点 3030 分表示为 530530;00 点 3030 分表示为 030030。流逝的分钟数可能超过 6060,也可能是负数。

输出格式

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

样例输入

1120 110

样例输出

1310

数据范围

  • 起始时间是一个合法的四位数字表示的时间(小时在 00 到 2323 之间,分钟在 00 到 5959 之间)。
  • 流逝的分钟数 mm 满足 −1440<m<1440-1440 < m < 1440。
  • 题目保证起始时间和终止时间在同一天内。

提示

一、C++ 里负数取模,结果是负的

这和数学课本不一样,必须记住:

printf("%d\n", -30 % 1440);   // -30,不是 1410

规则是:a % b 的结果符号跟着 a 走。被除数是负的,余数就是负的。

二、绕回正区间:加上周期再取模

int ans = ((-30 % 1440) + 1440) % 1440;   // 1410

通用模板(M 是周期):

((x % M) + M) % M
  • x % M 把范围压到 (-M, M);
  • + M 保证变成正数;
  • 再 % M 把多加的一个周期去掉。

三、什么时候会遇到负数

  • 往前推时间(减小时、减天数);
  • 两个数相减得到负的差值;
  • 坐标差、偏移量为负。

四、常见错误

  • 只写 x % M,结果为负,输出负数。

  • 只写 (x + M) % M:x 本身小于 -M 时仍然为负(比如 -3000 + 1440 还是负)。

  • 以为 C++ 的 % 和数学的「取余」完全一样。

  • 把起始时间拆成小时和分钟,再全部换算成「从 0 点开始的总分钟」。

  • 加上流逝的分钟数,然后把它绕回 [0, 1440) 这个范围——注意负数的情况。

  • 再换算回小时和分钟,按题面要求拼成四位数字输出。

自查:用 1120 110 → 1310 验证;再造一个负数分钟的输入(如 30 10 -60),看是否正确回到前一天范围内。