Fork me on GitHub

PHP编程趣事:能喝几瓶啤酒?

很早之前,就有了写点东西的打算,但是由于种种原因,一直拖到现在,好在迷途知返,终于走上了正轨。

在这里先做出如下声明:因本人文笔拙劣,可能博文中可能会出现错误或者词不达意之处,请大家能够谅解;同时也欢迎各位的批评和指正,在此先谢过大家。

接下来,我们进入今天的正题——有趣的编程题:

啤酒2元钱1瓶;4个瓶盖可换1瓶,2个空瓶可换1瓶,2个瓶盖和1个空瓶可换一瓶
问:10元可喝几瓶?

首先,我们先来分析一下这个问题:

其实这是一个算术题目,我们可以通过简单的推导得出答案,但是我们今天的目的是使用php写出关于这类问题的一个通用类,这个通用类中可自定义总钱数(这里为10),单价(这里为2)。

好了,解题具体思路有很多,这里我给出我的思路:使用while循环,条件是判断剩余钱数是否大于等于单价,如果为否则停止循环。循环体中的思路是如果瓶盖数可以换到1瓶,则将总钱数添加1个单价,同样,如果满足其它两个条件,则做出相同处理,费话不多说,直接上代码:

 

 1 class beer 
 2 {
 3     protected $total; # 总钱数
 4     protected $per; # 单价
 5     protected $beerCapNum; # 瓶盖数
 6     protected $emptyBottleNum; # 空瓶数 
 7     protected $drinkNum; # 总共喝酒瓶数
 8 
 9     public function __construct($total, $per)
10     {
11         $this->total = $total;
12         $this->per = $per;
13     }
14 
15     /* 用来展示喝酒过程 */
16     public function showDrinkProcess()
17     {
18         while($this->total >= $this->per)
19         {
20             $this->total -= $this->per; # 减去1瓶的钱数
21             $this->drinkNum ++;
22             $this->emptyBottleNum ++; # 增加喝的瓶数
23             $this->beerCapNum ++; # 增加一个瓶盖数
24 
25             # 两个空瓶可换一瓶
26             if($this->emptyBottleNum==2)
27             {
28                 $this->total += $this->per;
29                 $this->emptyBottleNum = 0;
30             }
31 
32             # 4个瓶盖可换一瓶
33             if($this->beerCapNum == 4)
34             {
35                 $this->total += $this->per;
36 
37                 $this->beerCapNum = 0;
38             }
39 
40             # 两个瓶盖和一个空瓶也可以换一瓶
41             if($this->beerCapNum>=2 && $this->emptyBottleNum==1)
42             {
43                 $this->total += $this->per;
44                 $this->emptyBottleNum = 0;
45                 $this->beerCapNum -= 2;
46             }
47 
48             echo '喝酒次数:',$this->drinkNum,' 剩余钱数:',$this->total,' 剩余瓶数:',$this->emptyBottleNum,' 剩余瓶盖:'.$this->beerCapNum,'<br />';
49         }
50     }
51 }

 

使用方法和计算结果:

header("content-type:text/html; charset='UTF-8'");

$beer = new beer(10, 2);
$beer->showDrinkProcess();

/********************以下为结果************************/

喝酒次数:1 剩余钱数:8 剩余瓶数:1 剩余瓶盖:1
喝酒次数:2 剩余钱数:8 剩余瓶数:0 剩余瓶盖:2
喝酒次数:3 剩余钱数:8 剩余瓶数:0 剩余瓶盖:1
喝酒次数:4 剩余钱数:8 剩余瓶数:0 剩余瓶盖:0
喝酒次数:5 剩余钱数:6 剩余瓶数:1 剩余瓶盖:1
喝酒次数:6 剩余钱数:6 剩余瓶数:0 剩余瓶盖:2
喝酒次数:7 剩余钱数:6 剩余瓶数:0 剩余瓶盖:1
喝酒次数:8 剩余钱数:6 剩余瓶数:0 剩余瓶盖:0
喝酒次数:9 剩余钱数:4 剩余瓶数:1 剩余瓶盖:1
喝酒次数:10 剩余钱数:4 剩余瓶数:0 剩余瓶盖:2
喝酒次数:11 剩余钱数:4 剩余瓶数:0 剩余瓶盖:1
喝酒次数:12 剩余钱数:4 剩余瓶数:0 剩余瓶盖:0
喝酒次数:13 剩余钱数:2 剩余瓶数:1 剩余瓶盖:1
喝酒次数:14 剩余钱数:2 剩余瓶数:0 剩余瓶盖:2
喝酒次数:15 剩余钱数:2 剩余瓶数:0 剩余瓶盖:1
喝酒次数:16 剩余钱数:2 剩余瓶数:0 剩余瓶盖:0
喝酒次数:17 剩余钱数:0 剩余瓶数:1 剩余瓶盖:1

总结:可见本题的结果为10元可喝17瓶啤酒。在实例化时通过传递不同参数($total和$per),可以得到对应的结果,使用方法相同,在这里就不做演示了。

 

以上就是我对“能喝几瓶啤酒”问题的解答,感谢您的阅读。

注:因本人的技术有限,如果有理解错误的地方,还请各位批评指正,共同交流学习,谢谢。我会继续努力的。

 

posted @ 2016-11-04 14:05  lovecucu  阅读(223)  评论(0编辑  收藏  举报