一、题目要求
书店针对《哈利波特》系列书籍进行促销活动,一共5卷,用编号0、1、2、3、4表示,单独一卷售价8元, 具体折扣如下所示:
本数 折扣
2 5%
3 10%
4 20%
5 25%
根据购买的卷数以及本数,会对应不同折扣规则情况。单数一本书只会对应一个折扣规则,例如购买了两本卷1,一本卷2,则可以享受5%的折扣,另外一本卷一则不享受优惠。
设计算法能够计算出读者购买一批书的最低价格。
二、设计思想
题目的关键是解决当购买6、7、8、9本时应如何购买。经计算,6本时:1本+5本最优;7本时:2本+5本最优;8本时:4本+4本最优;9本时:4本+5本最优。1-5本时不用特殊考虑,其他本数时将其转换为6-9本的情况处理。即将本数对10求余,余数大于5则将求余结果带入6-9本情况中,同时计算减去余数后包含几个5;余数小于五则直接计算减去余数后包含几个5,再加上余数的买书计算结果。
三、代码
1 #include<iostream.h> 2 3 void show(int x , double &sum) 4 { 5 if(x==6) 6 { 7 cout<<"5本一组,1本一组来购买"; 8 sum=sum+5*8*0.75+8; 9 } 10 if(x==7) 11 { 12 cout<<"5本一组,2本一组来购买"; 13 sum=sum+5*8*0.75+2*8*0.95; 14 } 15 if(x==8) 16 { 17 cout<<"4本一组,4本一组来购买"; 18 sum=sum+8*8*0.8; 19 } 20 if(x==9) 21 { 22 cout<<"5本一组,4本一组来购买"; 23 sum=sum+5*8*0.75+4*8*0.8; 24 } 25 } 26 27 void main() 28 { 29 cout<<"请输入要购买的本数:"<<endl; 30 int num,a,b,i; 31 double sum=0; 32 cin>>num; 33 cout<<"最优惠的方案是:"<<endl; 34 a=num%10; 35 if(a>5) 36 { 37 b=num/5-1; 38 for(i=1;i<=b;i++) 39 { 40 cout<<"5组一本,"; 41 } 42 sum=sum+b*8*5*0.75; 43 show(a,sum); 44 } 45 else if(a<5&&a>0) 46 { 47 a=a+5; 48 b=num/5-1; 49 for(i=1;i<=b;i++) 50 { 51 cout<<"5组一本,"; 52 } 53 sum=sum+b*8*5*0.75; 54 show(a,sum); 55 } 56 else 57 { 58 b=num/5; 59 for(i=1;i<=b;i++) 60 { 61 cout<<"5组一本,"; 62 } 63 sum=sum+b*8*5*0.75; 64 } 65 cout<<endl<<"一共花费"<<sum<<"元"<<endl; 66 }
四、运行结果截图
五、总结
这次题目是对设计好的算法的练习,一开始感觉用程序实现可以考虑遍历,枚举所有情况再找最小值,不会漏掉情况。但发现这样比较繁琐,而且在算法实现上最为耗时,不是最简洁的。然后通过计算购买6-9本的情况发现规律,和结对的同学讨论出了算法并实现。