zoukankan      html  css  js  c++  java
  • 求最低价格

    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 的整数)
    ";
    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<<"最大优惠方法是:	买"<<count<<"套全套, 再买"<<num%5<<"本不同的单本"<<endl;
    41         cout<<"最优惠的总价是:	"<<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<<"最大优惠方法是:	买"<<count<<"套全套, 再买8本分别两两相同的单本"<<endl;
    48         cout<<"最优惠的总价是:	"<<money<<""<<endl;
    49     }
    50     return 0;    
    51 }

    5、运行结果:

    测试数据  1231

    测试数据  sd213

    测试数据     1231.23

    6、总结分析:

      这次的实验,程序并不难,只是方法太难想到了!!都以为会有什么特殊的算法或是规律,结果真的就是只穷举计算一部分,然后分类计算。。。

    编程没有太多时间,一个多小时就搞定了,但这篇博客用了我一个多小时。。。。

    项目日志:

       2016 5、31            9:30-11:40       编写程序,修改,发布       约130min

  • 相关阅读:
    iOS地图开发
    常用iOS第三方库以及XCode插件介绍
    SDWebImage内部实现过程
    iOS-线程之GCD---之GCD的几种常用常用的方法
    iOS-线程之GCD方式---之同步异步和串行队列并行队列之间的关系
    iOS-获取系统的相册图片
    iOS开发-使用第三方库AFNetWorking解析JSON和XML数据
    iOS_UITableView上拉加载,下拉刷新
    launchImage
    launchImage
  • 原文地址:https://www.cnblogs.com/wangyw/p/5545068.html
Copyright © 2011-2022 走看看