zoukankan      html  css  js  c++  java
  • 课堂练习-购书问题

    题目:

    • 书店针对《哈利波特》系列书籍进行促销活动,一共5卷,用编号0、1、2、3、4表示,单独一卷售价8元。

    具体折扣如下所示:

    本数 折扣

     2   5%

     3     10%

     4     20%

     5     25%

    • 根据购买的卷数以及本数,会对应不同折扣规则情况。单数一本书只会对应一个折扣规则,例如购买了两本卷1,一本卷2,则可以享受5%的折扣,另外一本卷一则不享受优惠。

    • 设计算法能够计算出读者购买一批书的最低价格。

    设计思路:

    当购书数量在1-5本时,按最高折扣即可。

    当购书数量在6-9本时,除购买八本书以外,其他情况均为购买一个五本的优惠,再把剩下的一次性购买。

    当购买八本书的时候,购买两个四本的优惠,价格最低。

    当购买十本及十本以上的时,只需将购买数量拆分为更小的数。例如,购买十四本的时候,转换成购买两个五本和四本,因为购买五本已是最高折扣。

    在此,只需要将个位数为八的情况特殊处理。例如,购买十八本时,转换成购买两个五本和八本,即两个五本和两个四本。

    源代码(Java):

     1 import java.util.Scanner;
     2 
     3 /*
     4  * 当购买的书为1-5本时,按最大优惠买
     5  * 当购买的书为6 7 9 时,分别按y = 5 + x的优惠买 x = 1,2,4
     6  * 当购买的书为8时,按4 + 4的优惠买
     7  * 根据以上规律,当购买的书数个位数为8时,按y = 5 × x + (4 + 4)的优惠买(x是y除以5的除数)
     8  * 否则,按y = 5 × x + z的优惠买 (x是y除以5的除数,z是余数)
     9  * */
    10 public class Main {
    11     public static void main(String args[])
    12     {
    13         Scanner sc = new Scanner(System.in);
    14         System.out.print("请输入购买的书数:");
    15         int y = sc.nextInt(); // 输入的书数
    16         
    17         /*
    18          * 当个位数为8,x为y除以10的余数,z为8
    19          * 否则,x为y除以5的除数,z为余数 
    20          * */
    21         int x = -1,z = -1;
    22         double sum = 0;
    23         boolean isEight = false;
    24         if(y % 10 == 8)
    25         {
    26             x = y / 10;
    27             z = 8;
    28             isEight = true;
    29         }
    30         else
    31         {
    32             x = y / 5;
    33             z = y % 5;
    34         }
    35 
    36         /*
    37          * 分别计算余数z的所花的金额,z = 1,2,3,4,8
    38          * */
    39         double r = 0;
    40         switch(z)
    41         {
    42             case 1: r = 8;break;
    43             case 2: r = 2 * (1 - 0.05) * 8;break;
    44             case 3: r = 3 * (1 - 0.1) * 8;break;
    45             case 4: r = 4 * (1 - 0.2) * 8;break;
    46             case 8: r = 4 * (1 - 0.2) * 8 * 2;break;
    47             
    48         }
    49         double d_x = (double)x;
    50         /*
    51          * 计算所有的金额,分别计算余数为8与不为8的情况
    52          * */
    53         if(isEight == true)
    54         {
    55             sum = 5 * (1 - 0.25) * 8 * 2 * d_x + r;
    56         }
    57         else
    58         {
    59             sum = 5 * (1 - 0.25) * 8 * x + r;
    60         }
    61         
    62 
    63         /*
    64          * 输出购买方案和花费总金额
    65          * */
    66         String ss = "";
    67         if(isEight == true)
    68         {
    69             if(x != 0)
    70             {
    71                 ss = ss + (2 * x) + "次购买5本书的优惠,";
    72             }
    73             ss = ss + 2 + "次购买4本书的优惠";
    74         }
    75         else
    76         {
    77             if(x != 0)
    78             {
    79                 ss = ss + x + "次购买5本书的优惠,";
    80             }
    81             ss = ss + "1次购买" + z + "本书的优惠";
    82         }
    83         System.out.println("购买方案为:" + ss);
    84         System.out.println("所花的最少金额为" + sum);
    85     }
    86 }

    运行结果截图:

    个人总结:对于存在特殊情况的问题,可以先所有问题统一看待,然后特殊问题特殊处理。

  • 相关阅读:
    Cleve Moler MATLAB 创始人金秋10月中国大学校园行
    [原]ASP.NET中使用JQUERYEASYUI后,解决ClientScript.RegisterStartupScript 所注册脚本执行两次
    [原]ASP.NET中使用后端代码注册脚本 生成JQUERYEASYUI 的界面错位
    [原]jqueryeasyui 关闭tab如何自动切换到前一个tab
    [原创]C# 实例Oracle 备份,带进度提示
    停止Oracle 服务开机自动重启
    最新县及县以上行政区划代码(截止2009年12月31日)
    单元测试学习:无返回值,触发委托
    [笔记]GetRequestStream()超时问题(出现假死,卡住)
    asp.net 页面 css中图片不存在引发的异常
  • 原文地址:https://www.cnblogs.com/jj352095583/p/4498054.html
Copyright © 2011-2022 走看看