求最低价格

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

posted @ 2016-05-31 11:45  David~Wang  阅读(246)  评论(0编辑  收藏  举报