区间功能

时间:2009-09-22 02:19:50

标签: c++

我需要编写一个函数,在应用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

我已经能够对此行为进行编码,但我想将我的实现与(最有可能)更优化的解决方案进行比较。

1 个答案:

答案 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中删除减法,因为这可能导致超过区间顶端的值。相反,我不得不从初始加法中减去较低的值来进行补偿。然而,这只能从正值中减去才能正确,因此我用较高的值对其进行修改,使其为正值,并确保修改后的值不变(取绝对值将改变以后修改的值)。