课堂练习-购书问题

题目:

• 书店针对《哈利波特》系列书籍进行促销活动,一共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 }

运行结果截图:

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

时间: 2024-10-27 11:05:11

课堂练习-购书问题的相关文章

课堂作业-购书问题

1.题目要求: 书店针对<哈利波特>系列书籍进行促销活动,一共5卷,用编号0.1.2.3.4表示,单独一卷售价8元, 具体折扣如下所示: 本数                   折扣 2                    5% 3                    10% 4                    20% 5                    25% 根据购买的卷数以及本数,会对应不同折扣规则情况.单数一本书只会对应一个折扣规则,例如购买了两本卷1,一本卷2,则可

课堂实验--购书最低价实验

一.设计思想 本次实验是要计算出购买一批图书的最低价格,当选取不同类型的图书时购买者可以享受折扣,并且根据购买者买的图书种类的数目可以分为四档折扣,本数为2,3,4,5时的折扣分别为5%,10%,20%,25%. 本次题目的解题核心是找到最低价的规律,并且这个规律在每十本书中循环一次,在这十本书中除了八本书时享受20%的优惠以外,其它的都遵循优先享受25%优惠的规律,因此在计算最终价格时,只要将10的倍数的书和剩余的书分开来计算价格就可以了. 二.代码实现 //Hao Ying 2016/6/2

课堂练习—购书

设计思路:利用数学归纳法,可以得到一个很简单的规律,那就是只有在大于五且除以五余三时才会出现买八本时两个1234要比5+3便宜,其他就全是5+几就可以了. 代码实现: package test; import java.util.*; public class MinPrice { public static void main(String[] args) { double price=0; Scanner input=new Scanner(System.in); System.out.pr

软件工程课堂作业——购书问题

小组成员:陈志利   檀威 一.题目要求 书店针对<哈利波特>系列书籍进行促销活动,一共5卷,用编号0.1.2.3.4表示,单独一卷售价8元, 具体折扣如下所示:                                  本数                   折扣                                   2                       5%                                   3              

购书思想课堂作业4.14

1.题目: 书店针对<哈利波特>系列书籍进行促销活动,一共5卷,用编号0.1.2.3.4表示,单独一卷售价8元, 具体折扣如下所示: 本数                  折扣 2                       5% 3                       10% 4                       20% 5                       25% n根据购买的卷数以及本数,会对应不同折扣规则情况.单数一本书只会对应一个折扣规则,例如购买了两本

软件工程课堂训练————最便宜购书方案

一·实验题目: 某书店针对<哈利波特>系列书籍进行促销活动,一共5卷,用编号0.1.2.3.4表示,单独一卷售价8元,具体折扣如下所示: 本数                  折扣 2                       5% 3                       10% 4                       20% 5                       25% 根据购买的卷数以及本数,会对应不同折扣规则情况.单数一本书只会对应一个折扣规则,例如购买了两

咱们的课程里,有微信的这种菜单示例吗?---酷课堂iOS交流群问答整理(201810期)

酷课堂iOS交流群 我们是一个什么样的组织:酷课堂iOS交流群,聚集了一群热爱技术.有趣.有料,平均Q龄在10年以上的"老司机",他们遍布在全国/球各地,有知名企业iOS工程师.高校大学生.自由职业者--如果你也是这样的人,欢迎加入我们,一起畅聊iOS技术及周边. "很干""很佛系"每晚11点后熄灯(禁言),只聊技术,几乎不闲聊. IT从业者自学成功的不少,但从入门到放弃的人更多.一个人走的快,一群人走的远,希望你会是坚持到最后的那一波,希望我们

网上云课堂

1.6座网:http://www.6sit.com/ 2.网易云课堂:http://study.163.com/ 3.慕课网:http://www.imooc.com/ 4.极客学院:http://www.jikexueyuan.com/

Java类与对象——几个课堂例子的总结及作业

作业:使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”. 源代码: 1 import java.util.Scanner; 2 3 class sss123 { 4 //将用来计次的变量times给初始值为0 5 public static int times=0; 6 sss123() { 7 //构造函数,每创建一个实例times就增加1 8 times=times+1; 9 } 10 } 11 12 publi