我正在寻找一种优雅的方式来围绕圆的离散增量进行导航。
因此,想象一下在时钟上按一下指令,顺时针或逆时针移动一个增量。从1开始顺时针方向移动很容易 - 只需添加一个。但是当你达到12并且加一个时,算法需要重置为1而不是13。同样,走向另一个 - 当你从1逆时针移动时,算法应该将你移动到12而不是零。 / p>
我最初的想法是使用模数,所以想象12个增量,函数可能是:
new_position = ((curr_position + 12) + increment) % 12
但这显然无法处理从12-> 1或从12 <-1的过渡。
我确信有一个很好的方法可以做到这一点......
答案 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;
}