又碰到个算法的问题,想请教各位大大

2020-01-25 15:19发布

本帖最后由 lswhome 于 2014-1-9 02:35 编辑

就是计算某一时刻是否在某一时间段内:比如从23:25开始到第二天的8:30结束,某一时刻(几点几分)是否在这个时间段内
算法必须包含在同一天之内(比如00:00~23:00)和跨天(比如22:00~第二天的21:00)想来想去想不到好的算法,用C51。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
lswhome
2020-01-27 05:37
本帖最后由 lswhome 于 2014-1-10 01:24 编辑

沧海清风:
先把你的时间转换成分或秒
按照你的2个例子:
Start_t = 00:00 Now_t = 23:26 End_t = 23:59
Start_t = 12:30 Now_t = 8:30   End_t = 08:00

转换成下面的:
Start_m = 0    Now_m = 1406 End_m = 1439
Start_m = 750 Now_m = 510  End_m = 480

return Now_m >= Start_m && Now_m <= End_m

不好意思,你的算法部分是能够算出来的,就是在同一天的情况下或者不在同一天,但当前时间和结束时间在同一天的时候,结果是正确的,但是有一种跨天的情况,就会计算错误了
比如: Start_t = 12:30 Now_t = 13:30   End_t = 08:00(正确的话应该是返回1)

Start_m = 750 Now_m = 810  End_m = 480

那么
return( 810>=750 && 810<=480)等效return(1 && 0)因此返回0

呵呵,所以,我给改成这样了,理论上应该没问题了
        UINT16 N,S,E;

        N=Now_h*60+Now_m;//当前时间                           N=12:20=740
        S=Start_h*60+Start_m;//起始时间                   S=12:30=750
        E=End_h*60+End_m;//结束时间                           E=8:00=480

        if(E>=S)//如果在同一天
                return(N>=S && N<=E);//同一天的情况
        else
                return(!( N>=E && N<=S));//跨天的情况

非常感谢您的思路,很牛X的算法!!!

一周热门 更多>