帮助优化算法

时间:2009-09-05 06:20:25

标签: c# math formula

我有一个特殊的应用需要计算一些非常具体的东西,虽然我擅长逻辑,但数学一直是我的弱点。

给定一个数字,比如-20,它需要应用100个基数的计算(即,基数为100,而不是0.不要与基数100混淆,这将是完全不同的东西)。

换句话说,数学运算如下......,105,104,103,102,101,100,-101,-102,-103,-104,-105 ......

然后我需要根据这100个基数进行数学计算。

所以,例如:

-140 - 20 =  120
-120 - 20 =  100  
-115 - 20 = -105
-110 - 20 = -110
-105 - 20 = -115
 100 - 20 = -120  
 120 - 20 = -140

如果有帮助,问题与体育赔率有关。从理论上讲,这指的是金钱(风险1.40美元,一方赢1.00美元,另一方风险1.00美元赢1.20美元,.20差价是赌场称之为“果汁”或他们来回转移的钱。)但是,该计划不涉及真钱,它更像是一个模拟器。

我目前的公式是这样的:

decimal CalculateSides(decimal side, decimal vig)
{
    decimal newSide = side - vig;

    newSide = -(newSide < 0) ? newSide + 100 : newSide - 100;

    return (newSide < 0) ? newSide + 100 : newSide - 100;
}

虽然这个公式有效,但我对条件+/-不满意,但这基本上是唯一对我有用的公式。

有人可以建议一种改进方法吗?优选地,没有+/-的条件

编辑:

当我问这个问题时,我知道一个可能的答案是“这可能是你做得最好的方式”,这似乎是共识。

4 个答案:

答案 0 :(得分:6)

处理这个问题的一个明智的方法是在内部计算普通数字,从零到负数,只有加/减100表示​​。

答案 1 :(得分:2)

我强烈怀疑你的样本功能被破坏了。 它是复制粘贴还是你重新输入了它?

decimal CalculateSides(decimal side, decimal vig)
{
    decimal newSide = side - vig;
    newSide = -(newSide < 0) ? newSide + 100 : newSide - 100;
    return (newSide < 0) ? newSide + 100 : newSide - 100;
}

尝试使用CalculatesSides(115,20)得到-95,不太可能是你想要的。 (我明白结果应该是-105)。

然而,你在哪里写的东西似乎很清楚。我相信它应该是:

decimal CalculateSides(decimal side, decimal vig)
{
    decimal newSide;
    side = (side < 0) ? side + 100 : side - 100;
    newSide = side - vig;
    return (newSide < 0) ? newSide - 100 : newSide + 100;
}

这非常简单,并且不容易优化

  1. 将模式从100base更改为0base
  2. 以零基础计算
  3. 将结果库从0base转换为100base
  4. 你可以根据标志做一些技巧,以避免其他建议的测试,但结果将非常模糊,可能会更慢。

    我的建议是这样离开。

答案 2 :(得分:1)

通常会进行优化以使某些内容运行得更快。您是否确实发现您的代码运行速度不够快?我怀疑不是。

如果您的代码生成了正确的结果并且以不花费大量时间的方式执行,请不要管它,并专注于其他代码,这些代码是实际的而不是感知的问题。

如果您只是担心看起来的方式,请添加一些注释来解释它是如何工作的。无论如何,你很可能必须使用单配方解决方案,所以你不必浪费你的努力。

答案 3 :(得分:0)

'sign'解决方案可能更优雅:

decimal CalculateSides(decimal side, decimal vig)
{
    decimal res = side - vig  +  (100 * Math.Sign(side));
    return  res               +  (100 * Math.Sign(res));
}

请注意,您的算法不适用于您给出的示例。

相关问题