题目:
请用switch case 语句完成打折计算问题,结果保留两位小数,相应的打折方案如下表。
价格区间(单位:元) | 打折率 |
---|---|
(0,50) | 0.95 |
[50,100) | 0.9 |
[100,200) | 0.85 |
[200,300) | 0.8 |
[300,+∞) | 0.75 |
本题若用 if...else... 语句,则只需用代码翻译上述表格,源代码如下:
#include <stdio.h>
int main() {
double money, result = 0;
int n;
printf("请输入打折前金额:\n");
scanf("%lf", &money);
n = (int) money;
if (n < 50) {
result = money * 0.95;
} else if (n >= 50 && n < 100) {
result = money * 0.9;
} else if (n >= 100 && n < 200) {
result = money * 0.85;
} else if (n >= 200 && n < 300) {
result = money * 0.8;
} else if (n >= 300) {
result = money * 0.75;
} else {
printf("您的输入有误!");
}
if (result != 0) {
printf("打折后的金额为%.2lf元", result);
}
return 0;
}
本题若用 switch case 语句,则case将会有无穷个情况。这个问题看似就复杂了。在C语言里,我们有算法能将无穷化为有穷,下面我来分享一下我的算法。
核心思路
在 switch 语句前面做一次除法,先将输入的金额强制转换为int类型,然后除以50得到一个个位数,于是上面的打折方案表可等价于下表:
价格区间(单位:元) | 打折率 | case值 |
---|---|---|
(0,50) | 0.95 | 0 |
[50,100) | 0.9 | 1 |
[100,200) | 0.85 | 2,3 |
[200,300) | 0.8 | 4,5 |
[300,+∞) | 0.75 | [6,+∞) |
需要注意的是,当金额大于300元时,此时的case值是大于6的整数,即case取6, 7,8, 9,10等等,case又有无穷个情况,不难发现,金额大于300元时,都打75折,不妨在switch前用while循环判断n是否大于6,若大于6,则令n=6。
源代码如下:
#include <stdio.h>
int main() {
int n;
double money, result = 0;
printf("请输入打折前金额:\n");
scanf("%lf", &money);
n = (int) money / 50;
while (n > 6) {
n = 6;
}
switch (n) {
case 0:
printf("打折后的金额为%.2lf元", money * 0.95);
break;
case 1:
printf("打折后的金额为%.2lf元", money * 0.9);
break;
case 2:
case 3:
printf("打折后的金额为%.2lf元", money * 0.85);
break;
case 4:
case 5:
printf("打折后的金额为%.2lf元", money * 0.8);
break;
case 6:
printf("打折后的金额为%.2lf元", money * 0.75);
break;
default:
printf("您的输入有误!");
}
return 0;
}
编译运行上面的代码:
请输入打折前金额:
600.25
打折后的金额为450.19元