钳制到

时间:2018-02-21 03:50:51

标签: algorithm integer series integer-division clamp

我试图将数字钳制到一系列数字的较低值。例如,如果我有一个系列(对不好的符号表示抱歉)

[pq]其中p是任意整数,q是任意正数。

说我的系列q is 50...-150, -100, -50, 0, 50, 100, 150...

现在我想要的是一个函数f(y),它可以将任何数字钳制到系列中的下一个最低数字。

例如,如果我的号码为37,那我就期待f(37) = 0,我期待f(-37) = -50

我尝试了许多涉及模数和整数除法的算法,但我似乎无法弄明白。我尝试过的最新版本就是

(37 / q) * q对于正数而言非常有用,但对于介于-50和0之间的任何数字都不起作用。

我也试过了((37 - q) / q) * q,但这对于完全落入系列的负面案件不起作用。

修改

假设我没有整个系列,只有系列的乘数p

3 个答案:

答案 0 :(得分:2)

如果你想要纯粹的数学方法,不考虑计算效率,你可以通过添加一个大于或等于{{1}的正整数将输入p转换为正整数范围。并且是|p|的倍数,然后通过减去它来将其移回。 q满足了这一点。

这给出了: p^2*q

答案 1 :(得分:2)

您只需要使用整数欧几里德除法将y除以q,然后再将结果乘以q

f(y) = (y / q) * q

其中/代表欧几里得分区。

在不立即支持Euclidean分区的编程语言中,您必须手动实现它或调整语言支持的任何分区的结果。

例如,在C和C ++中,正向除数q的欧几里得除法可以通过本地" Fortran风格"来实现。分裂为

 (y >= 0 ? y : y - q + 1) / q

所以在C或C ++中,整个表达式看起来像

f(y) = (y >= 0 ? y : y - q + 1) / q * q

对于37,你得到了

f(37) = 37 / 50 * 50 = 0

对于-37,你得到了

f(-37) = (-37 - 50 + 1) / 50 * 50 = -86 / 50 * 50 = -50

答案 2 :(得分:1)

一旦确定模数结果为正,您就可以减去模数结果。在某些语言中,总是是积极的,但如果不是:

@media only screen and (max-width : 500px) { 
    .rslides { height: 250px !important; } 
    .rslides img { height: 250px !important; } 
}

C ++中的结果:https://ideone.com/kIuit8

Python中的结果:https://ideone.com/w6wUgZ