前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言算法之无穷化为有穷

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

作者头像
程序员小顺
发布2021-10-13 10:38:44
1.4K0
发布2021-10-13 10:38:44
举报
文章被收录于专栏:知识小木屋

题目:

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

价格区间(单位:元)

打折率

(0,50)

0.95

[50,100)

0.9

[100,200)

0.85

[200,300)

0.8

[300,+∞)

0.75

本题若用 if...else... 语句,则只需用代码翻译上述表格,源代码如下:

代码语言:javascript
复制
#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。

源代码如下:

代码语言:javascript
复制
#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;
}

编译运行上面的代码:

代码语言:javascript
复制
请输入打折前金额:
600.25
打折后的金额为450.19元
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 知识小木屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档