记录时间
题目:
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。
一、题型核心思路拆解(通用解题模板)
1. 本质:时分换算成总分钟做运算
这种时间加减分钟题万能套路:
1.把输入的 4 位时间数字拆成「小时 + 分钟」
2.统一换算成当天总分钟数(小时 ×60 + 分钟)
3.加上流逝的分钟(可正可负)得到结束总分钟
4.再把总分钟转回小时、分钟:
·小时 = 总分钟 / 60
·分钟 = 总分钟 % 60
5.按规则拼接输出,控制前导零
为什么这么做?
直接时分加减会遇到进位、借位、负数分钟,逻辑很麻烦;
全部转成纯数字总分钟,只做一次加减法,正负自动处理,大幅简化代码。
2. 输入拆分规则(重点)
输入是一个整数,形如 1106 / 530 / 30
·分钟 = 数字 % 100 (后两位)
·小时 = 数字 / 100 (前面剩下的)
举例:
·1106:1106%100=6 分,1106/100=11 时
·530:530%100=30 分,530/100=5 时
·30:30%100=30 分,30/100=0 时
3. 正负分钟自动兼容
总分钟可以变小(流逝负数分钟),题目保证都在同一天,不用跨天处理,不用 ±1440。
4. 输出格式规则(坑最多)
输出拼接规则:
1.小时直接输出,个位小时不加前导 0(0 点也直接输出 0)
2.分钟必须占两位,不足 10 补前导 0
示例:
·0 时 5 分 → 005
·5 时 30 分 → 530
·12 时 8 分 → 1208
二、完整 Java 实现 + 逐行注释
java
运行
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int time = sc.nextInt(); // 起始四位时间
int addMin = sc.nextInt(); // 流逝分钟,可负
// 1. 拆分时、分
int h = time / 100;
int m = time % 100;
// 2. 换算当天总分钟,加上流逝时间
int total = h * 60 + m + addMin;
// 3. 转回小时、分钟
int endH = total / 60;
int endM = total % 60;
// 4. 格式化输出:小时原样,分钟两位补0
System.out.printf("%d%02d", endH, endM);
sc.close();
}
}
三、测试案例演示
案例 1
输入:1106 3
拆分:11 时 6 分,总分钟 = 11×60+6=666
666+3=669
endH=669/60=11,endM=9
输出:1109
案例 2
输入:530 -10
5 时 30 分 → 330 分钟,330-10=320
320/60=5,320%60=20
输出:520
案例 3
输入:30 -40
0 时 30 分 → 30 分钟,30-40=-10
endH=-10/60=0,endM=-10%60=50
输出:050
案例 4
输入:85 120
0 时 85 分 → 0 时 85 分,总 85 +120=205
205/60=3,205%60=25
输出:325
四、这类题型通用解题步骤(以后同类题直接套)
1.拆分:四位时间整数 /100 得小时,%100 得分钟
2.归一:统一换算总分钟 h*60+m
3.运算:加上偏移分钟(支持正负)
4.还原:新小时 = 总分钟 / 60,新分钟 = 总分钟 %60
5.格式化输出:小时直接输出,分钟固定两位补 0,用 %02d
五、常见易错点
1.直接时分加减,忘记借位 / 进位,负数分钟处理混乱
2.输出分钟忘记补 0,比如 5 分输出 5 而不是 05
3.误以为输入一定是四位数整数,忽略 0 点 30 输入是 30 这种三位数
4.用 if 判断分钟是否小于 10 再拼接,不如 printf 格式化简洁
浙公网安备 33010602011771号