需要免费住宿的数学公式

Need math formula for free nights

更新:显然,人们认为这是一项家庭作业,并且对我的问题投了反对票。不是。这是一个重生的业务逻辑问题,从答案中可以看出这是一个非常复杂的数学问题。我将不胜感激,这样我就可以继续使用这个网站了。

我需要计算一个免费住宿计算器的公式。免费住宿选项可能有所不同。例如付6,住7。付5,住7。

给定变量中的两个数字,我需要能够传递住宿天数,并计算出您支付的数量和免费获得的数量。

例如:

Pay for 5, stay for 7.

1 night = pay for 1, 0 free
2 nights = pay for 2, 0 free
3 nights = pay for 3, 0 free
4 nights = pay for 4, 0 free
5 nights = pay for 5, 0 free
6 nights = pay for 5, 1 free
7 nights = pay for 5, 2 free
8 nights = pay for 6, 2 free
9 nights = pay for 7, 2 free
10 nights = pay for 8, 2 free
11 nights = pay for 9, 2 free
12 nights = pay for 10, 2 free
13 nights = pay for 10, 3 free
14 nights = pay for 10, 4 free
15 nights = pay for 11, 4 free
16 nights = pay for 12, 4 free
17 nights = pay for 13, 4 free
18 nights = pay for 14, 4 free

我在想我需要使用模数,但想不通。

$pay_for = 5;
$stay_for = 7;
for($i=1;$i<=18;$i++) {
    $modulo = $i % $pay_for;
    echo("nights:{$i}, remainder:{$modulo}<br>\n");
}

感谢您的帮助!

已编辑:在我上面的例子中遗漏了一行所以更新了。

这实际上 比我想象的要简单得多。你是对的,模数是关键。我打算用伪代码来写这个,因为我已经有一年没写 PHP 了,你是对的,这是语言不可知论。

function earned-free-night (nights-stayed) {
    return 5 <= (nights-stayed % 7) <= 6;
}

function display-sheet () {
    for (var night = 1, free = 0; night <= 18; night++) {
        print("Night#: " + night + ", Free nights: " + free);

        if (earned-free-night(night)) {
            free++;
        }   
    }
}

如果住宿晚数以 7 为模,为 5 或 6,则添加一晚免费住宿。

这是我用来测试它的一些工作 (Clojure) 代码。如果您想尝试编译器,可以在线轻松获得:

(defn free-night? [nights-stayed]
  (<= 5 (rem nights-stayed 7) 6))

(defn -main []
  (loop [night-n 1
         free-nights 0]
    (println (str "Night#: " night-n ", Free nights: " free-nights))
    (if (<= night-n 18)
      (recur (inc night-n)
             (if (free-night? night-n) (inc free-nights) free-nights)))))