用于在钟面或指南针(或任何其他圆圈)周围导航的算法或功能?

时间:2010-12-13 18:49:19

标签: c# java algorithm

我正在寻找一种优雅的方式来围绕圆的离散增量进行导航。

因此,想象一下在时钟上按一下指令,顺时针或逆时针移动一个增量。从1开始顺时针方向移动很容易 - 只需添加一个。但是当你达到12并且加一个时,算法需要重置为1而不是13。同样,走向另一个 - 当你从1逆时针移动时,算法应该将你移动到12而不是零。 / p>

我最初的想法是使用模数,所以想象12个增量,函数可能是:

new_position = ((curr_position + 12) + increment) % 12

但这显然无法处理从12-> 1或从12 <-1的过渡。

我确信有一个很好的方法可以做到这一点......

4 个答案:

答案 0 :(得分:4)

部分问题在于你在考虑12:00 == 12.当你意识到12:00 == 0时,这会变得更容易。

答案 1 :(得分:0)

如果您不希望if检查否定数并添加12,则可以使用以下内容(我不确定它是否优雅):

((current+increment) % 12 + 12)) % 12

答案 2 :(得分:0)

也许不是最佳的,但我会这样做:

int GetTime(int current, int increment)
{
    int result = current + increment;
    return result >= 0 ? result : result + 12;
}

答案 3 :(得分:0)

这个算法是O(n),但它应该适用于合理的输入。

private static int AdvanceHours(int hour, int hoursToAdvance)
{
    Debug.Assert(1 <= hour && hour <= 12);
    hour += hoursToAdvance;
    while (hour < 1)
        hour += 12;
    while (hour > 12)
        hour -= 12;
    return hour;
}