Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 围绕时钟面或指南针(或任何其他圆圈)导航的算法或功能?_C#_Java_Algorithm - Fatal编程技术网

C# 围绕时钟面或指南针(或任何其他圆圈)导航的算法或功能?

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时,

我正在寻找一种优雅的方式,在圆的离散增量上导航

想象一下,给时钟上的指针一个指令,顺时针或逆时针移动一个增量。从1开始顺时针移动很容易-只需添加一个。但当你达到12并添加一个时,算法需要重置回1,而不是13。类似地,换一种方式——当你从1开始逆时针移动时,算法应该将你移动到12,而不是0

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

新位置=((当前位置+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,直到其为正数。