3

我的问题是如何用数学公式替换那些 if ?

if ($l <= 3500)
{
    $min = 100;
}
elseif ($l <= 4000)
{
    $min = 120;
}
elseif ($l <= 4500)
{
    $min = 140;
}
elseif ($l <= 5000)
{
    $min = 160;
}

如您所见,每 500 个级别提高 20 个。

4

3 回答 3

6

如您所见,每 500 个级别提高 20 个。

嗯,这就是你的公式。

$min = 100 + ceil(($l-3500)/500) * 20;
  • 我们从基础值 100 开始,并将其添加到计算的其余部分。
  • $l开始时少了 3500。
  • 我们ceil()的结果是因为我们只想在传递整个值时跳转。
  • 我们将其乘以 20。

如果我们要解决$l小于 3500 的情况并将 100 设置为最小值,我们还需要资产$l-3500大于零。我们可以这样做:

$min = 100 + ceil(max(0,$l-3500)/500) * 20;

我是怎么到那里的?

我们实际上在做的是绘制一条线。就像您自己说的那样,我们对每个恒定数量进行恒定数量。我们这里有一种叫做线性进展的东西。

太好了,所以我们认识到了我们面临的问题。我们有一条假想线要绘制,我们想要整数值。接下来是什么?好吧,让我们看看这条线从哪里开始?

在您的情况下,答案非常简单。

if ($l <= 3500) {
    $min = 100;
}

那是我们的出发点。所以我们知道重点(3500,100)就在我们的线上。这意味着结果从 开始,100原点从 开始3500

我们知道我们的公式是 的形式100+<something>。那是什么东西?

就像你说的,每 500 级你提高 20 级。所以我们知道我们20/500每 1 级移动一次(因为好吧,如果我们将它乘以 500,我们就得到了我们的原始规则)。我们也知道(从以前)我们从 开始3500

现在,我们可能很想使用$min = 100 + ($l-3500) * (20/500);,这几乎是正确的。这里唯一的问题是您只需要整数值。这就是为什么我们ceil将 level/500 的值仅用于获取整步。

我试图用尽可能少的数学术语来保持这一点,如果你想要更正式的东西,你可以查看维基百科页面。如果您需要任何澄清 - 让我知道

于 2013-10-20T06:50:21.780 回答
0

You can express the function as follows:

f(x) := a * x + b

The inclination of the line is calculated as:

a := 20 / 500

To find b you need to extrapolate a value that's on the line; in this case, that could be 3500 (x) and 120 (f(x)). That works out to be -40.

So the function has become:

f(x) := (20 / 500) * x - 40

There are two special cases:

  1. Left of 3500 the value of f(x) must remain 100, even though f(x) is less.
  2. The inclination is not continuous but discrete.

Both cases applied:

$min = max(100, ceil($l / 500) * 20 - 40)
于 2013-10-20T08:22:41.917 回答
0

这是我关于这个问题的方法。它并不比单行公式好,但为了可修改,我一般决定这种解决方案:

$min = 100;
for($i=3500; $i<=5000; $i+=500)
{
   if($l <= $i) break;
   $min += 20;
}
//Now $min has got desired value.
于 2013-10-20T06:55:19.737 回答