我试图将数字钳制到一系列数字的较低值。例如,如果我有一个系列(对不好的符号表示抱歉)
[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
。
答案 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