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 から始めて、それを残りの計算に追加します。
  • $l3500以下から始まります。
  • 値全体をceil()渡すときにのみジャンプしたいので、結果です。
  • これを 20 倍します。

$lが 3500 未満の場合に対処し、 100 を最小値として設定する場合$l-3500は、0 より大きい値もアセットにする必要があります。これを次のように行うことができます。

$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これが、レベル/500 の値で全ステップのみを取得する理由です。

できるだけ数学用語を使わないようにしています。より正式なものが必要な場合は、ウィキペディアのページを確認してください。説明が必要な場合はお知らせください

于 2013-10-20T06:50:21.780 に答える
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 に答える
0

関数は次のように表現できます。

f(x) := a * x + b

ラインの傾きは次のように計算されます。

a := 20 / 500

見つけるbには、線上にある値を推定する必要があります。この場合、それは3500(x) と120(f(x)) になります。それはうまくいきます-40

したがって、関数は次のようになりました。

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

次の 2 つの特殊なケースがあります。

  1. f(x) が小さくても、3500の値の左はのf(x)ままでなければなりません。100
  2. 傾斜は連続的ではなく、離散的です。

両方のケースが適用されます:

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