汽水瓶换汽水 算法解析
1元买2瓶汽水,2个汽水瓶换1瓶汽水,
问5元总共能得多少瓶汽水
循环算法
/*
* 汽水瓶 循环算法
* $n:当前汽水总数, $c:换1瓶汽水需要空瓶数
*/
function get_total($n, $c)
{
$total = $n;
while ($n >= $c) {
$t = intval($n / $c);
$total += $t;
$n = $t + $n % $c;
echo "累计汽水数:" . $total . " 当前空瓶数:" . $n . "<br>";
}
// 如最后只差1空瓶可以换汽水,则先借1瓶汽水,喝完汽水还回空瓶
if ($c - $n == 1) {
$total += 1;
$n = 0;
}
return "最终汽水数:" . $total . ",最终空瓶数:" . $n;
}
累计汽水数:15 当前空瓶数:5
累计汽水数:17 当前空瓶数:3
累计汽水数:18 当前空瓶数:2
累计汽水数:19 当前空瓶数:1
最终汽水数:20,最终空瓶数:0
递归算法
/*
* 递归算法
* $n:当前空瓶总数, $c:换1瓶汽水需要空瓶数
*/
function recursive($n, $c)
{
//至少差两个空瓶,不能换汽水
if ($c - $n > 1) {
return 0;
} elseif ($c - $n == 1) {
//差一个空瓶,可以先喝汽水后给瓶
return 1;
} else {
return intval($n / $c) + recursive(intval($n / $c) + $n % $c, $c);
}
}
汽水瓶换汽水数:10
总共汽水数:20
数学算法
公式:换得汽水数 = 汽水瓶数 / (换汽水需要瓶数 - 1)
/*
* 汽水瓶 数学算法
* $n:当前汽水总数, $c:换1瓶汽水需要空瓶数
*/
function bottle($n, $c)
{
return $n + intval($n / ($c - 1));
}
总共得汽水数:20