鱼C论坛

 找回密码
 立即注册
查看: 2257|回复: 5

[已解决]c编程企业利润编制,输入100W以上的数就出负数是怎么回事

[复制链接]
发表于 2019-3-14 14:36:32 | 显示全部楼层 |阅读模式

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

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

x
#if(0)
利润I低于或等于10万元时,奖金可提成10% ;
利润高于10万元,低于20万元(100000<I≤200000)时,其中10万元按10%提成,
高于10万元的部分,可提成7.5% ;200000<I≤400000时,其中20万元仍按上述
办法提成(下同),高于20万元的部分按5%提成;400000<I≤1000000时,高于40万的部分按1.5%提成;
I>1000000时,超过100万元的部分按1%提成。从键盘输入当月利润I,求应发放
奖金总数。
#endif

用的VC 6.0


#include<stdio.h>

void main()
{
        int i,money;
        printf("please input the i\n");
        scanf("%d",&i);
        switch(i<=100000)
        {
        case 1:money=i*0.1;
                           break;
        case 0:switch(i>100000&&i<=200000)
                   {
                        case 1:money=100000*0.1+(i-100000)*0.075;
                                           break;
                        case 0:switch(i>200000&&i<=400000)
                                   {
                                        case 1:money=100000*0.1+10000*0.075+(i-200000)*0.05;
                                                break;
                                        case 0:switch(i>400000&&i<=1000000)
                                                   {
                                                        case 1:money=100000*0.1+100000*0.075+200000*0.05+(i-400000)*0.015;
                                                                break;
                                                        case 0:switch(i>1000000)
                                                                   {
                                                                           money=100000*0.1+100000*0.075+200000*0.05+600000*0.015+(i-1000000)*0.01;
                                                                           break;
                                                                   }
                                                   }

                                   }
                   }
        }
        printf("%d",money);
       
}
最佳答案
2019-3-14 15:09:39
这写法。。算了不吐槽了。。。
你最后一个case 0后面跟的语句是
  1. switch(i>1000000)
  2.                                                                    {
  3.                                                                            money=100000*0.1+100000*0.075+200000*0.05+600000*0.015+(i-1000000)*0.01;
  4.                                                                            break;
  5.                                                                    }
复制代码
没有case语句大括号里的语句是不会执行的。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-14 15:09:39 | 显示全部楼层    本楼为最佳答案   
这写法。。算了不吐槽了。。。
你最后一个case 0后面跟的语句是
  1. switch(i>1000000)
  2.                                                                    {
  3.                                                                            money=100000*0.1+100000*0.075+200000*0.05+600000*0.015+(i-1000000)*0.01;
  4.                                                                            break;
  5.                                                                    }
复制代码
没有case语句大括号里的语句是不会执行的。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-14 15:13:48 | 显示全部楼层
Croper 发表于 2019-3-14 15:09
这写法。。算了不吐槽了。。。
你最后一个case 0后面跟的语句是没有case语句大括号里的语句是不会执行的。 ...

刚学C,在练习经典100题,谢谢, 明白了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-14 15:40:36 | 显示全部楼层
你为什么要用switch?
很明显是你结构错误导致的
#include<stdio.h>

void main()
{
        double i, money;
        printf("please input the i\n");
        scanf_s("%lf", &i);
        if (i <= 100000)
        {
                money = i*0.1;
        }
        else if (i > 100000 && i <= 200000)
        {
                money = 100000 * 0.1 + (i - 100000)*0.075;
        }
        else if (i > 200000 && i <= 400000)
        {
                money = 100000 * 0.1 + 10000 * 0.075 + (i - 200000)*0.05;
        }
        else if (i > 400000 && i <= 1000000)
        {
                money = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + (i - 400000)*0.015;
        }
        else if(i>1000000)
        {
                money = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 600000 * 0.015 + (i - 1000000)*0.01;
        }
        printf("%lf\n", money);
        system("pause");
}

int 在vc6.0中的范围为4个字节,也就是可以表示到(2^32)-1位数据,因为有正负,所以只能表示到2^31的正数,20多亿,够用了
而且,你题目中涉及到小数,用int会降低精度,所以建议用double,double为8个字节,2^63位数,够用了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-14 15:58:23 | 显示全部楼层
暗pluto 发表于 2019-3-14 15:40
你为什么要用switch?
很明显是你结构错误导致的
#include

谢谢啊,题目上非要我用switch,小鱼老师难为我。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-14 17:28:08 | 显示全部楼层
本帖最后由 Croper 于 2019-3-14 17:34 编辑

论如何强行使用switch
  1. #include <stdio.h>

  2. #ifndef min
  3. #define min(a,b)            (((a) < (b)) ? (a) : (b))
  4. #endif

  5. #define USE_SWITCH

  6. const int INCOMESEG[] = {0,100000,200000,400000,1000000,0x7FFFFFFF };
  7. const double RADIO[] = { 0.1,0.075,0.05,0.015,0.01 };

  8. int GetIncomeSeg(int i) {
  9.         const int N = sizeof(INCOMESEG) / sizeof(int);
  10.         int p = 0, q = N;
  11.         while (p < q) {
  12.                 int n = (p + q) / 2;
  13.                 if (i >= INCOMESEG[n]) p = n + 1;
  14.                 else q = n;
  15.         }

  16.         return p;
  17. }

  18. int main() {
  19.         int i;
  20.         int money = 0;
  21.         printf("please input the i\n");
  22.         scanf("%d", &i);

  23. #ifdef USE_SWITCH
  24.         int seg = GetIncomeSeg(i);
  25.         switch (seg) {
  26.         case 5:
  27.                 money += (i - INCOMESEG[5])*RADIO[4];
  28.                 i = INCOMESEG[4];
  29.                 //no break;
  30.         case 4:
  31.                 money += (i - INCOMESEG[3])*RADIO[3];
  32.                 i = INCOMESEG[3];
  33.                 //no break;
  34.         case 3:
  35.                 money += (i - INCOMESEG[2])*RADIO[2];
  36.                 i = INCOMESEG[2];
  37.                 //no break;
  38.         case 2:
  39.                 money += (i - INCOMESEG[1])*RADIO[1];
  40.                 i = INCOMESEG[1];
  41.                 //no break;
  42.         case 1:
  43.                 money += i * RADIO[0];
  44.         }
  45. #else
  46.         int j;
  47.         for (j = 0;; ++j) {
  48.                 money += (min(i, INCOMESEG[j+1])-INCOMESEG[j])*RADIO[j];
  49.                 if (i < INCOMESEG[j + 1]) break;
  50.         }
  51. #endif
  52.         printf("%d", money);
  53. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 13:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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