我的问题是如何用数学公式替换那些?
if ($l <= 3500)
{
$min = 100;
}
elseif ($l <= 4000)
{
$min = 120;
}
elseif ($l <= 4500)
{
$min = 140;
}
elseif ($l <= 5000)
{
$min = 160;
}
如你所见,每500个级别提高20个。
答案 0 :(得分:6)
如你所见,每500个级别提高20个。
嗯,那就是你的公式。
$min = 100 + ceil(($l-3500)/500) * 20;
$l
以3500以下开始。ceil()
结果,因为我们只想在传递整个值时跳转。如果我们想要解决$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>
。那是什么东西?
就像你说的那样,你每提升20个等级就有20个。所以我们知道每1个等级移动20/500
(因为如果我们将它乘以500得到我们的原始规则)。我们也知道(从以前)我们从3500
开始。
现在,我们可能会想要使用$min = 100 + ($l-3500) * (20/500);
并且几乎。这里唯一的问题是你只需要整数值。这就是为什么我们ceil
等级/ 500的值只能得到整个步骤。
我尽量用尽可能少的数学术语来保持这一点,如果你想要更正式的东西,你可以检查the wikipedia page。如果您想要任何澄清 - 请告诉我
答案 1 :(得分:0)
以下是我对此问题的处理方法。它并不比单线公式更好,但为了可修改,我通常会决定这种解决方案:
$min = 100;
for($i=3500; $i<=5000; $i+=500)
{
if($l <= $i) break;
$min += 20;
}
//Now $min has got desired value.
答案 2 :(得分:0)
您可以按如下方式表达该功能:
f(x) := a * x + b
线的倾斜度计算如下:
a := 20 / 500
要查找b
,您需要推断线上的值;在这种情况下,可以是3500
(x)和120
(f(x))。这可能是-40
。
因此该功能已成为:
f(x) := (20 / 500) * x - 40
有两种特殊情况:
3500
左侧f(x)
的值必须保持100
,即使f(x)较小。两种情况都适用:
$min = max(100, ceil($l / 500) * 20 - 40)