天天看點

課堂練習-購書問題

題目:

• 書店針對《哈利波特》系列書籍進行促銷活動,一共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 }      

運作結果截圖:

課堂練習-購書問題
課堂練習-購書問題
課堂練習-購書問題

個人總結:對于存在特殊情況的問題,可以先所有問題統一看待,然後特殊問題特殊處理。