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失败的范围a和b超过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为单位的话会很好,所以它会解决一般情况而不是特定于我的问题.
首先计算a mod n,b mod n和c 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)