我有一个特殊的应用需要计算一些非常具体的东西,虽然我擅长逻辑,但数学一直是我的弱点。
给定一个数字,比如-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;
}
虽然这个公式有效,但我对条件+/-不满意,但这基本上是唯一对我有用的公式。
有人可以建议一种改进方法吗?优选地,没有+/-的条件
编辑:
当我问这个问题时,我知道一个可能的答案是“这可能是你做得最好的方式”,这似乎是共识。
答案 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;
}
这非常简单,并且不容易优化
你可以根据标志做一些技巧,以避免其他建议的测试,但结果将非常模糊,可能会更慢。
我的建议是这样离开。
答案 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));
}
请注意,您的算法不适用于您给出的示例。