我正在寻找一种有效的算法,将整数值限制在一个范围内,同时还将其基数 10 端更改为多个可变长度端之一。
这应该在
value
和 min
之间夹住 max
,同时将末端更改为 ends
中定义的特定末端之一,尽可能接近原始值。
输入数据示例:
ends: [26, 201, 300] (sorted list of integers, at least a factor 10 smaller than <value>)
min: 5350
max: 7392
value: 2000
-> 5426
value: 6205
-> 6201
value: 7400
-> 7300
我将在 Go 中实现这一点,但也欢迎任何伪代码或其他命令式语言。
我猜你知道如何夹紧:
clamp(n, min, max) = max(min, min(max, n))
然后要删除末尾并将其替换为应该结束的内容,您需要 10 的下一个更高的幂:
nextPowerOf10(n) {
if (n == 0)
return 10 // mathematically not correct but works here
x = 1
while (n > 0) {
x = x * 10
n = n / 10 // integer division
}
return x
}
因此替换被夹紧数字的末尾
c
变得简单:
replace(n, end) = n % nextPowerOf10(end) + end
然后你就可以查对方的号码了,一切都放在一起了:
clampEnd(n, min, max, end) {
m = clamp(n, min, max)
p = nextPowerOf10(end)
m = m % p + end
if (m < n && n - m >= m + p - n)
return m + p
else if (m > n && m - n > n - m + p)
return m - p
return m
}