C# 围绕时钟面或指南针(或任何其他圆圈)导航的算法或功能?
我正在寻找一种优雅的方式,在圆的离散增量上导航 想象一下,给时钟上的指针一个指令,顺时针或逆时针移动一个增量。从1开始顺时针移动很容易-只需添加一个。但当你达到12并添加一个时,算法需要重置回1,而不是13。类似地,换一种方式——当你从1开始逆时针移动时,算法应该将你移动到12,而不是0 我最初的想法是使用模,想象12个增量,函数可能是:C# 围绕时钟面或指南针(或任何其他圆圈)导航的算法或功能?,c#,java,algorithm,C#,Java,Algorithm,我正在寻找一种优雅的方式,在圆的离散增量上导航 想象一下,给时钟上的指针一个指令,顺时针或逆时针移动一个增量。从1开始顺时针移动很容易-只需添加一个。但当你达到12并添加一个时,算法需要重置回1,而不是13。类似地,换一种方式——当你从1开始逆时针移动时,算法应该将你移动到12,而不是0 我最初的想法是使用模,想象12个增量,函数可能是: 新位置=((当前位置+12)+增量)%12 但这显然不能处理从12->1或从12的转换,问题的一部分是你认为12:00==12。当你意识到12:00==0时,
新位置=((当前位置+12)+增量)%12
但这显然不能处理从12->1或从12的转换,问题的一部分是你认为12:00==12。当你意识到12:00==0时,这就变得容易了。问题的一部分是你认为12:00==12。当你意识到12:00==0时,这会变得更容易。如果你不想
如果检查负片并添加12,你可以使用以下方法(我不确定它是否优雅):
如果你不想If
检查底片并添加12张底片,你可以使用以下方法(我不确定它是否优雅):
也许不是最理想的,但我会:
int GetTime(int current, int increment)
{
int result = current + increment;
return result >= 0 ? result : result + 12;
}
也许不是最理想的,但我会:
int GetTime(int current, int increment)
{
int result = current + increment;
return result >= 0 ? result : result + 12;
}
该算法是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;
}
private static intadvancehours(inthour,inthourstoadvance)
{
Assert(1这个算法是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;
}
private static intadvancehours(inthour,inthourstoadvance)
{
Debug.Assert(1)当我十几岁的时候,我写了一个BBS,我搞砸了凌晨12点/下午12点这么多不同的方式,我都记不清了。当然,我意识到12等于0。我不明白这种认识有什么特别的帮助。因为它允许你在每次递增移动后将数字模化12。从11->12等于(11+1)%12==0。从那里你继续加。对于减去增量,测试一个负值,然后加12,直到它为正值。当我十几岁的时候,我写了一个BBS,我搞砸了凌晨12点/下午12点的许多不同方式,我甚至记不清它们。当然,我意识到12等于0。我不明白这种认识有什么特别的帮助。因为它允许你在每次增量移动后,将数字模化12。从11->12移动等于(11+1)%12==0。从这里开始继续添加。对于减去增量,测试负数并添加12,直到其为正数。