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;
}

浙公网安备 33010602011771号