课堂练习之《买书》
题目要求:
书店针对《哈利波特》系列书籍进行促销活动,一共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<<"\t* 非整数按整数部分处理"<<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}; //前十本书的价格表,当我需要时,直接拿过来用,后来为了方便打折,将计算过程也列出来了,变成了代码所示的那样,这样方便理解和修改,但是时间复杂度可能就大了。