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

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

WBOY
Freigeben: 2016-06-06 20:29:39
Original
1406 Leute haben es durchsucht

题目:

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

程序:

<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>
Nach dem Login kopieren
Nach dem Login kopieren

答案:

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

求简洁的正确算法。

回复内容:

题目:

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

程序:

<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>
Nach dem Login kopieren
Nach dem Login kopieren

答案:

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

求简洁的正确算法。

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

就好比问:从 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>
Nach dem Login kopieren

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

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

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

<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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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

推广开还可以这样

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

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>
Nach dem Login kopieren

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

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

求得x为27

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

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

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage