题目:
• 书店针对《哈利波特》系列书籍进行促销活动,一共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 }
运行结果截图:
个人总结:对于存在特殊情况的问题,可以先所有问题统一看待,然后特殊问题特殊处理。