为了账号安全,请及时绑定邮箱和手机立即绑定

求钟表时针和分钟夹角算法问题

标签:
PHP 算法

这是一道原博主面试中遇到的算法题,他觉得蛮有意思的所以写出来与大家分享一下。
皮一下,很开心。

问题

给定一个时间值,需要计算出表盘上时针与分针的之间的夹角度数。

思路

虽然题目中只有一个条件,但其实已经有许多隐含条件包括在内。
我们要得出的是时针和分针之间的角度,在一个钟表上因为钟表是圆形,所以我们得出第二个已知条件,表盘360°;第三个已知条件,表盘上有 12 个小时刻度;第三个已知条件,分针走一圈时针走一个刻度。
虽然题目里没有给出以上条件,但常识告诉我们这些条件。
拿到这些条件我们的计算就简单了:
首先计算得出一些我们需要的数值,如每增加一小时时针走多少度,分针增加一分钟走多少度,分针每走一分钟带动时针走多少度。
得到这些值后我们与给定的时间进行计算:

小时 * 每增加一小时时针走多少度 = 整点时间时时针度数
分钟 * 分针每走一分钟带动时针走多少度 = 分针带动时针度数
整点时间时时针度数 + 分针带动时针度数 = 此时时针度数
分钟 * 分针增加一分钟走多少度  = 分针度数
此时时针度数 - 分针度数 = |夹角度数|
取绝对值就得出了它们之间的夹角度数

实现代码

<?php

function calculate($time){

    $hour = (int) date('H', $time);
    $hour =  $hour > 12 ? $hour - 12 : $hour;
    $minute = (int) date('m', $time);

    // 钟表总度数
    $timekeeperAngle = 360;
    // 时间刻度份数
    $scale = 12;
    // 每份时间刻度占用的度数
    $oneScale = $timekeeperAngle / $scale;
    // 分针每走1分钟时针转动的度数
    $oneRelateScale = $oneScale / 60;
    // 分针每走1分钟转动的度数
    $oneMinuteScale = $timekeeperAngle / 60;

    // 小时*每份度数 得 整点时间的时针度数
    $integralScale = $hour * $oneScale;
    // 分针带动时针走的度数
    $relateScale = $minute * $oneRelateScale;

    // 时针真正的起始点度数
    $relayHourScale = $integralScale + $relateScale;

    // 分钟的现在度数
    $relayMinuteScale = $minute * $oneMinuteScale;

    echo abs($relayHourScale - $relayMinuteScale);
}

calculate(time());
点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消