鱼C论坛

 找回密码
 立即注册
查看: 1925|回复: 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后面跟的语句是
switch(i>1000000)
                                                                   {
                                                                           money=100000*0.1+100000*0.075+200000*0.05+600000*0.015+(i-1000000)*0.01;
                                                                           break;
                                                                   }
没有case语句大括号里的语句是不会执行的。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-14 15:09:39 | 显示全部楼层    本楼为最佳答案   
这写法。。算了不吐槽了。。。
你最后一个case 0后面跟的语句是
switch(i>1000000)
                                                                   {
                                                                           money=100000*0.1+100000*0.075+200000*0.05+600000*0.015+(i-1000000)*0.01;
                                                                           break;
                                                                   }
没有case语句大括号里的语句是不会执行的。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

刚学C,在练习经典100题,谢谢, 明白了。
想知道小甲鱼最近在做啥?请访问 -> 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位数,够用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢啊,题目上非要我用switch,小鱼老师难为我。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

#ifndef min
#define min(a,b)            (((a) < (b)) ? (a) : (b))
#endif

#define USE_SWITCH

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

int GetIncomeSeg(int i) {
        const int N = sizeof(INCOMESEG) / sizeof(int);
        int p = 0, q = N;
        while (p < q) {
                int n = (p + q) / 2;
                if (i >= INCOMESEG[n]) p = n + 1;
                else q = n;
        }

        return p;
}

int main() {
        int i;
        int money = 0;
        printf("please input the i\n");
        scanf("%d", &i);

#ifdef USE_SWITCH
        int seg = GetIncomeSeg(i);
        switch (seg) {
        case 5:
                money += (i - INCOMESEG[5])*RADIO[4];
                i = INCOMESEG[4];
                //no break;
        case 4:
                money += (i - INCOMESEG[3])*RADIO[3];
                i = INCOMESEG[3];
                //no break;
        case 3:
                money += (i - INCOMESEG[2])*RADIO[2];
                i = INCOMESEG[2];
                //no break;
        case 2:
                money += (i - INCOMESEG[1])*RADIO[1];
                i = INCOMESEG[1];
                //no break;
        case 1:
                money += i * RADIO[0];
        }
#else
        int j;
        for (j = 0;; ++j) {
                money += (min(i, INCOMESEG[j+1])-INCOMESEG[j])*RADIO[j];
                if (i < INCOMESEG[j + 1]) break;
        }
#endif
        printf("%d", money);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 10:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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