C语言算法之无穷化为有穷

C/C++
265
0
0
2022-11-14

题目:

请用switch case 语句完成打折计算问题,结果保留两位小数,相应的打折方案如下表。

本题若用 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元