#t31. 时间计算问题
时间计算问题
时间计算问题
题目描述
有时候人们用四位数字表示一个时间,比如 表示 点零 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 点 分表示为 ; 点 分表示为 。注意,第二个数字表示的分钟数可能超过 ,也可能是负数。
输入格式
输入在一行中给出 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 点 分表示为 ; 点 分表示为 。流逝的分钟数可能超过 ,也可能是负数。
输出格式
输出不多于四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。
样例输入
1120 110
样例输出
1310
数据范围
- 起始时间是一个合法的四位数字表示的时间(小时在 到 之间,分钟在 到 之间)。
- 流逝的分钟数 满足 。
- 题目保证起始时间和终止时间在同一天内。
提示
一、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),看是否正确回到前一天范围内。