课堂练习之《买书》

题目要求:

     书店针对《哈利波特》系列书籍进行促销活动,一共5卷,用编号0、1、2、3、4表示,单独一卷售价8元, 具体折扣如下所示:
书的数目      折扣价
1      100%
2      95%
3      90%
4      80%
5      75%
     根据购买的卷数以及本数,会对应不同折扣规则情况。单数一本书只会对应一个折扣规则,例如购买了两本卷1,一本卷2,则可以享受5%的折扣,另外一本卷一则不享受优惠。设计算法能够计算出读者购买一批书的最低价格。

设计思想:

    情况一、1-5本时,按照正常的价格进行打折。
    情况二、当第6-10(除去8)本时,按照数目拆分成(5+n)来进行打折,比如6本,就可以先买五本,再买一本。
    情况三、当第8本时,变成了(4+4)最优惠。
    根据以上几种情况,第8中另外考虑。我们设数目为number,再看它有x个十本(以十本为单位),十本的数目乘以60。然后再看不足十本的数目,y=number%10,这样,将y乘以对应的十本以内的最优惠价格,加上之前的以十本为单位算出来的数目,即为最后的最优惠的总价格。

代码实现

 1 /*
 2  * 课堂练习之《买书》
 3  * Sno:20133078
 4  * Anthor:yulei
 5  * Date:2016.6.1
 6  */
 7 #include <iostream>
 8 using namespace std;
 9 double Buy(int number)   //钱向书的本数转换
10 {
11     double a[6]={0,1,0.95,0.9,0.8,0.75};   //打折表,第n本打折率为a[n]
12     double b[11];
13     //double b[11]={0,8,15.2,21.6,25.6,30,38,45.2,51.2,55.6,60};   //前十本书的价格表
14 
15     for(int i=0;i<11;i++)   //用循环来实现前十本价格表的构建
16     {
17         int x=i/5;
18         int y=i%5;
19         if(i==8)
20         {
21             b[i]=(4*8*a[4])*2;    //当第8本时候,选取4+4的优惠政策更便宜
22         }
23         b[i]=x*5*8*a[5]+y*8*a[y];    //除去第8本,其他采用5+n的优惠方法来计算最便宜
24     }
25     int m=number/10;    //数目中有几个“十本”
26     int n=number%10;    //不足是本,剩下的按照价格变来加入总书目
27     double price;   //价格为两部分组成
28     price = m*60+b[n];
29     return price;
30 }
31 int main()
32 {
33     int number;
34     cout<<"请输入任何数量的书:"<<endl;
35     cout<<"	* 非整数按整数部分处理"<<endl;
36     cin>>number;
37     while(number<0)    //不能输入负数
38     {
39         cout<<"不能输入负数,请重新输入:";
40         cin>>number;
41     }
42     cout<<"最少需要的钱数:"<<Buy(number)<<endl;
43     return 0;
44 }

运行截图

 

总结

      开始的时候,我将前十本的价格进行了固定,即先算出最优惠的价格,做了这样一个表,double b[11]={0,8,15.2,21.6,25.6,30,38,45.2,51.2,55.6,60}; //前十本书的价格表,当我需要时,直接拿过来用,后来为了方便打折,将计算过程也列出来了,变成了代码所示的那样,这样方便理解和修改,但是时间复杂度可能就大了。

 
原文地址:https://www.cnblogs.com/cnyulei/p/5561565.html