Home >Backend Development >PHP Tutorial >面试题 - PHP算法逻辑:如何计算购买量?

面试题 - PHP算法逻辑:如何计算购买量?

WBOY
WBOYOriginal
2016-06-06 20:29:391403browse

题目:

<code>有36个人去游玩,需要买水,商店活动买3瓶赠送一瓶。
请问题目至少需要买多少瓶饮料才可以人手一瓶?</code>

程序:

<code>
function mathBuy($total, $range = 3)
{
    $buy = $i = 0;
    while ($total > 0) {
        $total--;
        $i++;
        if ($i % $range == 0) {
            $i = 0;
        } else {
            $buy++;
        }
    }

    return $buy;
}
</code>

答案:

<code>var_dump(mathBuy(36, 3)); // 计算结果24瓶,正确答案是27</code>

求简洁的正确算法。

回复内容:

题目:

<code>有36个人去游玩,需要买水,商店活动买3瓶赠送一瓶。
请问题目至少需要买多少瓶饮料才可以人手一瓶?</code>

程序:

<code>
function mathBuy($total, $range = 3)
{
    $buy = $i = 0;
    while ($total > 0) {
        $total--;
        $i++;
        if ($i % $range == 0) {
            $i = 0;
        } else {
            $buy++;
        }
    }

    return $buy;
}
</code>

答案:

<code>var_dump(mathBuy(36, 3)); // 计算结果24瓶,正确答案是27</code>

求简洁的正确算法。

上午就看到这个问题了,一直没有回答。现在突然发现,这是个好问题。

就好比问:从 1 累加到 n,和是多少?

老师之所以教我们 for(i=1;i 是为了教我们 <strong>for 循环的写法</strong>,而不是为了求1到n的累加和。我们遇到这种问题时,应该写 <code>n*(n+1)/2

所以:

<code>php</code><code class="lang-php">function mathBuy($total, $range = 3)
{
    return $total/($range+1)*$range;
}
</code>

谢谢 @Yian 的回复。修改一下。对于小数,需要向上取整。

<code>php</code><code class="lang-php">function mathBuy($total, $range = 3)
{
    return ceil($total/($range+1)*$range);
}
</code>

感觉一行代码就好了啊,数学分析下就行。
只是针对这个题目而言,没有考虑到所有情况。

<code><?php $a = 36;//买水数
$b = 3;//赠送条件
//$x + $x/$b = $a;
//$x*((1+$b)/$b)=$a;

$x = $a*$b/(1+$b);

echo $x;//27
</code></code>

36/(3+1)*3 = 27

<code>PHP</code><code class="lang-PHP">function mathBuy($total, $range = 3)
{
    $remainder = $total % ($range + 1);
    $quotient = round($total / ($range + 1), 0);
    return $quotient * $range + $remainder;
}
</code>

P.S.题主说答案是24瓶,我有点费解 = =

手机码字,有点乱 题主你这个代码逻辑是错的。 举个栗子: 假如总共买4瓶水。走一下你的while逻辑

第一轮

total 3 i 1 buy 1

第二轮

total 2 i 2 buy 2

第三轮

total 1 i 0 buy 2 这里出错

第四轮

total 0 i 1 buy 3

买4瓶水看样子结果是正确的。但是由于你的逻辑错了,在第三次买水的时候就不需要掏钱了。你再理解理解。 对了,我是从你的程序员如何提高逻辑思维能力过来的。 改正

<code class="php">function mathBuy($total, $range = 3)
{
    $buy = $i = 0;
    while ($total > 0) {
        $total--;
        $i++;
        if ($i % ($range+1) == 0) {
            $i = 0;
        } else {
            $buy++;
        }
    }

    return $buy;
}
</code>

x + x/3 = 36
=> 4x/3 = 36

推广开还可以这样

<code class="php">function quantity($total, $present) 
{
    return ceil($total * $present / ($present + 1));
}</code>

total为需要的总数,present买几瓶送一瓶,返回值便是,需要最少需要买多少瓶,ceil是当出现小数时强取整.

运行结果
$total : 36, $present: 3 => 27
$total : 76, $present: 4 => 61
$total : 105, $present: 5 => 88

大家都在用数学算法,我就给一很土的办法,按照机器的思维来判断

这个程序的逻辑就是,每次都买一瓶,然后看看手里的水有多少瓶,当水的数量和人的数量相等的时候就可以回家了

<code class="PHP"><?php function waterBuy($people, $range)
{
    $water = 0;     //目前拥有的水
    $buySum = 0;    //购买的数量
    $rm = 0;        //活动临时储存变量
    while ($water != $people) {
        $buySum++;
        $water++;
        $rm++;
        if ($rm == $range) {
            $water++;
            $rm = 0;
        }
    }
    return $buySum;
}

echo waterBuy(36, 3);</code></code>

一元一次方程,水的单价为1,需要的支付为x,每支付3可以获得4瓶水,所以

$$ x * {4 / 3} = 36 $$

求得x为27

楼主大概是想说:每三个空瓶子可以再换一瓶满的吧?

php是世界上最好的语言,没有之一

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn