1、题目要求:
书店针对《哈利波特》系列书籍进行促销活动,一共5卷,用编号0、1、2、3、4表示,单独一卷售价8元, 具体折扣如下所示:
本数 折扣
2 5%
3 10%
4 20%
5 25%
根据购买的卷数以及本数,会对应不同折扣规则情况。单数一本书只会对应一个折扣规则,例如购买了两本卷1,一本卷2,则可以享受5%的折扣,另外一本卷一则不享受优惠。设计算法能够计算出读者购买一批书的最低价格。
2、实现思路:
买书6~10本的时候,我对这些情况进行了穷举,(由于折扣价总是比单买一本便宜,一下买四本比分别买两本便宜……所以将2拆成1+1,4拆成3+1、2+2等情况不计)
总数 | 购买数 | 计算 | 总价 |
6 | 5+1 | 8*5*75%+8*1 | 38 |
4+2 | 8*4*80%+8*2*95% | 40.8 | |
3+3 | 8*3*90%+8*3*90% | 43.2 | |
7 | 5+2 | 8*5*75%+8*2*95% | 45.2 |
4+3 | 8*4*80%+8*3*90% | 47.2 | |
8 | 5+3 | 8*5*75%+8*3*90% | 51.6 |
4+4 | 8*4*80%+8*4*80% | 51.2 | |
9 | 5+4 | 8*5*75%+8*4*80% | 55.6 |
4+4+1 | 8*4*80%+8*4*80%+8 | 59.2 |
由表观察可得,除了买8本时,分为两个4本计算是最便宜外,其他情况下都是先扣除 5本一套才最便宜。
同理,书的数量不断增加,依旧是这样。因此,只要将书五本一套这样分开,除了余下3本的情况需要另算外,其他情况都按照5本的优惠来算,就应当是最优惠。
3、思路整理(实现步骤):
输入要买的本数,要判断输入的是否合法;
通过除以5 取余数来判断应该用哪一种购买方式(上课时老师说是除以10,经过编程实践发现,除以5 比较简单一点);
按照最便宜的方式进行计算,并输出。
4.源代码:
1 //王永维,2016,5,31 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 int num=0;//书的数量 7 double money=0;//钱的总值 8 int count;//整套数 9 int danben;//单本数 10 cout<<"请输入购买数量:"<<endl; 11 cin>>num; 12 //判断输入的是否为正整数,若输入了负数或字母开头的字符串 ,会报错 13 //字母在后边,只取字母前的整数 14 //输入小数,会直接取整数部分 15 if (cin.fail()||num<=0) 16 { 17 cout << "输入有误!(请输入大于0 的整数)\n"; 18 return 0; 19 } 20 if (num%5!=3) 21 { 22 count=num/5; 23 danben=num%5; 24 if (danben==0)//5的倍数,全部按照25%的折扣 25 { 26 money=8*5*0.75*count; 27 } 28 else if (danben==1)//多处来一本,按照原价计算 29 { 30 money=8*5*0.75*count+8; 31 } 32 else if (danben==2)//多处来两本,按照5%折扣计算 33 { 34 money=8*5*0.75*count+8*2*0.95; 35 } 36 else//多处来四本,按照20%折扣计算 37 { 38 money=8*5*0.75*count+8*4*0.8; 39 } 40 cout<<"最大优惠方法是:\t买"<<count<<"套全套, 再买"<<num%5<<"本不同的单本"<<endl; 41 cout<<"最优惠的总价是:\t"<<money<<"元"<<endl; 42 } 43 else//多处来三本,少买一套,其余的八本按照4+4的20%折扣算 44 { 45 count=num/5-1; 46 money=8*5*0.25*count+8*4*0.2*2; 47 cout<<"最大优惠方法是:\t买"<<count<<"套全套, 再买8本分别两两相同的单本"<<endl; 48 cout<<"最优惠的总价是:\t"<<money<<"元"<<endl; 49 } 50 return 0; 51 }
5、运行结果:
测试数据 1231
测试数据 sd213
测试数据 1231.23
6、总结分析:
这次的实验,程序并不难,只是方法太难想到了!!都以为会有什么特殊的算法或是规律,结果真的就是只穷举计算一部分,然后分类计算。。。
编程没有太多时间,一个多小时就搞定了,但这篇博客用了我一个多小时。。。。
项目日志:
2016 5、31 9:30-11:40 编写程序,修改,发布 约130min