鱼C论坛

 找回密码
 立即注册
查看: 2273|回复: 2

[已解决]C语言习题100 第二题 算法问题

[复制链接]
发表于 2021-1-9 21:34:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
main()
{
        long int n,i;
        double j;
        printf("请输入总利润:");
        scanf("%ld",&n);
        i = n/100000;
        printf("%d\n",i);
        switch(i)
        {
        case 0: j = n*0.1;
        case 1: j = 100000*0.1+(n-100000)*0.075;
        case 2: j = 10000+7500+(n-200000)*0.05;
        case 3: j = 10000+7500+(n-200000)*0.05;
        case 4: j = 10000+7500+10000+(n-400000)*0.03;
        case 5: j = 10000+7500+10000+(n-400000)*0.03;
        case 6: j = 10000+7500+10000+6000+(n-600000)*0.015;
        case 7: j = 10000+7500+10000+6000+(n-600000)*0.015;
        case 8: j = 10000+7500+10000+6000+(n-600000)*0.015;
        case 9: j = 10000+7500+10000+6000+(n-600000)*0.015;
        case 10: j = 10000+7500+10000+6000+6000+(n-1000000)*0.01;
        default : j = 10000+7500+10000+6000+6000+(n-1000000)*0.01;
        }
        printf("奖金总数为%lf\n",j);
}

请输入总利润:600000
6
奖金总数为35500.000000
Press any key to continue


为什么不是 10000+7500+10000+6000=33500
而是35500
最佳答案
2021-1-9 21:36:11
本帖最后由 jackz007 于 2021-1-9 21:47 编辑

        每一个 case 的语句块必须以一个 break 结束,否则,从 case 语句的进入点开始,将会顺序执行遇到的每一条语句,而无视这些语句是否属于本 case 语句块。
        例如,当 i 为 6 的时候,将会从 6 的人口进入,执行完属于自己的语句块后,还会继续向后执行 i = 7、8、9、10、default 的语句块,全部执行完才会罢休。
        所以,引起你疑问的答案就是这个值其实根本就不属于 i = 6 ,而是属于 default 的计算结果。
  1.         switch(i)
  2.         {
  3.         case 0: j = n*0.1;braek;
  4.         case 1: j = 100000*0.1+(n-100000)*0.075;braek;
  5.         case 2: j = 10000+7500+(n-200000)*0.05;braek;
  6.         case 3: j = 10000+7500+(n-200000)*0.05;braek;
  7.         case 4: j = 10000+7500+10000+(n-400000)*0.03;braek;
  8.         case 5: j = 10000+7500+10000+(n-400000)*0.03;braek;
  9.         case 6: j = 10000+7500+10000+6000+(n-600000)*0.015;braek;
  10.         case 7: j = 10000+7500+10000+6000+(n-600000)*0.015;braek;
  11.         case 8: j = 10000+7500+10000+6000+(n-600000)*0.015;braek;
  12.         case 9: j = 10000+7500+10000+6000+(n-600000)*0.015;braek;
  13.         case 10: j = 10000+7500+10000+6000+6000+(n-1000000)*0.01;braek;
  14.         default : j = 10000+7500+10000+6000+6000+(n-1000000)*0.01;braek;
  15.         }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-9 21:36:11 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-1-9 21:47 编辑

        每一个 case 的语句块必须以一个 break 结束,否则,从 case 语句的进入点开始,将会顺序执行遇到的每一条语句,而无视这些语句是否属于本 case 语句块。
        例如,当 i 为 6 的时候,将会从 6 的人口进入,执行完属于自己的语句块后,还会继续向后执行 i = 7、8、9、10、default 的语句块,全部执行完才会罢休。
        所以,引起你疑问的答案就是这个值其实根本就不属于 i = 6 ,而是属于 default 的计算结果。
  1.         switch(i)
  2.         {
  3.         case 0: j = n*0.1;braek;
  4.         case 1: j = 100000*0.1+(n-100000)*0.075;braek;
  5.         case 2: j = 10000+7500+(n-200000)*0.05;braek;
  6.         case 3: j = 10000+7500+(n-200000)*0.05;braek;
  7.         case 4: j = 10000+7500+10000+(n-400000)*0.03;braek;
  8.         case 5: j = 10000+7500+10000+(n-400000)*0.03;braek;
  9.         case 6: j = 10000+7500+10000+6000+(n-600000)*0.015;braek;
  10.         case 7: j = 10000+7500+10000+6000+(n-600000)*0.015;braek;
  11.         case 8: j = 10000+7500+10000+6000+(n-600000)*0.015;braek;
  12.         case 9: j = 10000+7500+10000+6000+(n-600000)*0.015;braek;
  13.         case 10: j = 10000+7500+10000+6000+6000+(n-1000000)*0.01;braek;
  14.         default : j = 10000+7500+10000+6000+6000+(n-1000000)*0.01;braek;
  15.         }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2021-1-14 16:48:39 | 显示全部楼层
jackz007 发表于 2021-1-9 21:36
每一个 case 的语句块必须以一个 break 结束,否则,从 case 语句的进入点开始,将会顺序执行遇到 ...

感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-5 18:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表