php 折扣计算,PHP算法逻辑:如何计算购买量?

题目:

有36个人去游玩,需要买水,商店活动买3瓶赠送一瓶。

请问题目至少需要买多少瓶饮料才可以人手一瓶?

程序:

function mathBuy($total, $range = 3)

{

$buy = $i = 0;

while ($total > 0) {

$total--;

$i++;

if ($i % $range == 0) {

$i = 0;

} else {

$buy++;

}

}

return $buy;

}

答案:

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

求简洁的正确算法。

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

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

老师之所以教我们

for(i=1;i<=n;i++) sum+=i;

是为了教我们 for 循环的写法,而不是为了求1到n的累加和。我们遇到这种问题时,应该写

n*(n+1)/2

所以:

php

function mathBuy($total, $range = 3)

{

return $total/($range+1)*$range;

}

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

php

function mathBuy($total, $range = 3)

{

return ceil($total/($range+1)*$range);

}

感觉一行代码就好了啊,数学分析下就行。

只是针对这个题目而言,没有考虑到所有情况。

<?php

$a = 36;//买水数

$b = 3;//赠送条件

//$x + $x/$b = $a;

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

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

echo $x;//27

36/(3+1)*3 = 27

PHP

function mathBuy($total, $range = 3)

{

$remainder = $total % ($range + 1);

$quotient = round($total / ($range + 1), 0);

return $quotient * $range + $remainder;

}

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瓶水看样子结果是正确的。但是由于你的逻辑错了,在第三次买水的时候就不需要掏钱了。你再理解理解。

对了,我是从你的程序员如何提高逻辑思维能力过来的。

改正

function mathBuy($total, $range = 3)

{

$buy = $i = 0;

while ($total > 0) {

$total--;

$i++;

if ($i % ($range+1) == 0) {

$i = 0;

} else {

$buy++;

}

}

return $buy;

}

x + x/3 = 36

=> 4x/3 = 36

推广开还可以这样

function quantity($total, $present)

{

return ceil($total * $present / ($present + 1));

}

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

运行结果

$total : 36, $present: 3 => 27

$total : 76, $present: 4 => 61

$total : 105, $present: 5 => 88

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

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

<?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);

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

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

求得x为27

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值