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

  • 相关阅读:
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Python位运算符
  • 原文地址:https://www.cnblogs.com/wangyw/p/5545068.html
Copyright © 2011-2022 走看看