博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
课堂练习-购书问题
阅读量:5252 次
发布时间:2019-06-14

本文共 2690 字,大约阅读时间需要 8 分钟。

题目:

• 书店针对《哈利波特》系列书籍进行促销活动,一共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为819          * 否则,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         else31         {32             x = y / 5;33             z = y % 5;34         }35 36         /*37          * 分别计算余数z的所花的金额,z = 1,2,3,4,838          * */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         else58         {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         else76         {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 }

运行结果截图:

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

转载于:https://www.cnblogs.com/jj352095583/p/4498054.html

你可能感兴趣的文章
SQL Server Service Broker 简单例子 (转)
查看>>
php设计模式课程---4、观察者模式的好处是什么
查看>>
搞笑视频分析---3、爱做饭的芋头:佛跳墙
查看>>
js cookie可选参数(document.cookie='name=张三;expires='+day;)
查看>>
HorizontalScrollView水平滚动控件
查看>>
C# Thread.Jion()
查看>>
python -- self 简单理解
查看>>
STL-<queue>-priority queue的使用
查看>>
Ajax的调试错误信息的输出
查看>>
四则运算程序 Update1
查看>>
EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)
查看>>
GetViewUrl
查看>>
Spark如何使用Akka实现进程、节点通信的简明介绍
查看>>
我的母亲 (老舍)
查看>>
ubuntu 内核清理日志
查看>>
【WPF开发备忘】使用MVVM模式开发中列表控件内的按钮事件无法触发解决方法
查看>>
CountDownLatch 闭锁、FutureTask、Semaphore信号量、Barrier栅栏
查看>>
mybatis一对一关联查询——(八)
查看>>
groovy
查看>>
对象扩展
查看>>