我需要编写一个函数,在应用delta之后在区间[a..b]内返回一个值。
void foo(a, b, val, delta);
例1:
value = foo(0, 360, 120, -240);
价值:240
示例2:
value = foo(360, 0, 60, 340);
值:40
我已经能够对此行为进行编码,但我想将我的实现与(最有可能)更优化的解决方案进行比较。
答案 0 :(得分:1)
我在Perl中打了几行。似乎在我测试的几个例子上工作。
print ((($val + $delta) % abs($a - $b)) + ($a<$b?$a:$b));
我将delta添加到值中,用A和B之间的绝对差值来修改(保证值在范围内),然后重新添加较小的值(如果范围不在某个数字之间)和0)。最后一个术语是if-then简写技术,如果条件为真,则取第一个值,如果不是,则取第2个值。
希望我明白你想要做的正确。
编辑: 第二眼看,我认为如果任何一方都不是0,上面的等式就不能正确处理边界。重新思考之后,我相信下面会更好:
print (((($val + $delta) % ($a>$b?$a:$b) - ($a<$b?$a:$b)) % abs($a-$b)) + ($a<$b?$a:$b));
之前,将20添加到较低的值,最后将40添加到最终结果。我不小心加了两次20。一旦进入最后一个学期,一次因为我用一个小于20的值进行修改(其余为20)。我无法取消最后一个术语,因为它不会在范围内,并且我无法从mod中删除减法,因为这可能导致超过区间顶端的值。相反,我不得不从初始加法中减去较低的值来进行补偿。然而,这只能从正值中减去才能正确,因此我用较高的值对其进行修改,使其为正值,并确保修改后的值不变(取绝对值将改变以后修改的值)。