在模运算中确定数字是否在两个数之间的算法

Kev*_*son 9 language-agnostic algorithm modular-arithmetic

我正在尝试编写一个回答问题的函数:如果你开始计数a并停止计数b,则c在该范围内(也就是c介于a和之间b).

通常a < c && c < b就足够了,但我是模块化算法:

(框图)

逆时针正在增加.

绿色:是c的值,其中算法应指示true(其中c在a和b之间)

蓝色:是c的值,其中算法应该指示false(其中c不在a和b之间)(这恰好与c在b和a之间的位置相同)

简单的a < c && c < b失败的范围ab超过0 的范围.

例如,假设A = 300和B = 45.如果C是10,则该函数将返回真:300,301,302 ... 359,0,1,2,3 ... 8,9,10,11 ,12 ... 43,44,45.因此,在360中,10在300和45之间.

最终,我想要确定的是一个色调是否在两个其他色调之间,其中色调是以色轮周围的度数指定的(这是一个mod 360系统).如果答案是以mod为单位的话会很好,所以它会解决一般情况而不是特定于我的问题.

xas*_*hru 6

首先计算a mod n,b mod nc mod n.

如果a < b那时我们需要检查一下a < c && c < b.这是模块化算术不起重要作用的简单情况.

因为[a,b]和[b,a]形成不相交的区域,而不是试图处理交叉0的问题,我们可以测试反向的情况b < a.如果b < c && c < a为真,则c实际上在b和a之间,因此不在a和b之间.

代码示例:

a = a % n;  // % = mod
b = b % n;
c = c % n;

if (a < b) {
    if (a < c && c < b) return true;
    else return false;
} else { // b < a
    if (b < c && c < a) return false;   // if in [b, a] then not in [a, b]
    else return true;
}
Run Code Online (Sandbox Code Playgroud)