有趣的算法题:有时针分针秒针的钟表上,一天之内,时针和分针可重合多少次?分别在什么时刻重合?
原题:在一个有时针,分针和秒针的钟表上,一天之内,时针和分针可以重合多少次?分别在什么时刻重合?
- 明确概念
秒针角度(每秒 6 度)
分针角度(每分钟 6 度 + 每秒 0.1 度)
时针角度(每小时 30 度 + 每分钟 0.5 度 + 每秒 0.5 / 60 度)
根据这个公式,列出二元一次方程,解它即可 - 为啥这样
360/60秒=6度,1分钟走6度,则60s走6度,1秒走0.1度
360/12小时=30度,1小时走30度,则60分钟走30度,1分钟走0.5度,1秒钟走0.5/60度 - 答案
在 12 小时内,时针和分针会重合 11 次,大约分别在:12:00, 1:05, 2:10, 3:15, 4:20, 5:25, 6:30, 7:35, 8:40, 9:45, 10:50,并不是完全精确
因为时针和分针不是每小时整点重合,而是会在每小时稍后的某个具体分钟数重合一次。
一天是 24 小时,所以总共是:
11 × 2 = 22 次重合
扩展:时针、分针、秒针可以重合多少次?分别在什么时刻重合
同理,列三元一次方程。
只需在上一个问题答案的基础上,带入答案验证即可
- 答案:只有00:00:00和12:00:00两个满足
代码实现
//时分重合
function getOverlapTimes() {const times = [];// 12 小时周期,重复两次(AM 和 PM)for (let h = 0; h < 12; h++) {// 重合的分钟数const totalMinutes = (60 / 11) * h;//二元一次方程列出来 带入hconst minutes = Math.floor(totalMinutes);//得到分钟,只能是整数,必有误差const seconds = Math.round((totalMinutes - minutes) * 60);//根据误差得到秒数// 转成字符串时间格式const formatTime = (hourOffset) => {const hour = (h + hourOffset) % 24;const hh = hour.toString().padStart(2, '0');//补全const mm = minutes.toString().padStart(2, '0');const ss = seconds.toString().padStart(2, '0');return `${hh}:${mm}:${ss}`;};// 添加 AM 和 PM 两组时间times.push(formatTime(0)); // AMtimes.push(formatTime(12)); // PM}return times;
}console.log(getOverlapTimes());
/*
["00:00:00", "12:00:00","01:05:27", "13:05:27","02:10:55", "14:10:55","03:16:21", "15:16:21","04:21:49", "16:21:49","05:27:16", "17:27:16","06:32:43", "18:32:43","07:38:10", "19:38:10","08:43:38", "20:43:38","09:49:05", "21:49:05","10:54:32", "22:54:32","11:59:59", "23:59:59"
]*///三针重合
for (let h = 0; h < 12; h++) {for (let m = 0; m < 60; m++) {for (let s = 0; s < 60; s++) {const secondDeg = s * 6;const minuteDeg = m * 6 + s * 0.1;const hourDeg = h * 30 + m * 0.5 + s * (0.5 / 60);if (Math.abs(secondDeg - minuteDeg) < 0.0001 &&Math.abs(minuteDeg - hourDeg) < 0.0001) {console.log(`${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`);}}}
}
/*
00:00:00
12:00:00
*/