搜索
查看: 2922|回复: 8

我做不了这一题

[复制链接]
发表于 2012-9-12 21:27:29 | 显示全部楼层 |阅读模式
5啊哈币
本帖最后由 tom075395 于 2012-9-12 21:47 编辑

题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%20万到40万之间时,高于20万元的部分,可提成5%40万到60万之间时高于40万元的部分,可提成3%60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
1.
程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。



#include <stdio.h>
int main()
{        
    long int I;
    scanf("%ld",&I);
        if(I<=100000) I=I*0.1;
    else if(I>100000 && I<200000) I=I*0.75;

    else if(I>200000 && I<400000) I=I*0.5;

    else if(I>400000 && I<600000) I=I*0.3;

    else if(I>600000 && I<1000000) I=I*0.1;

    printf("%d",I);
        
    sleep("puase");
        return 0;
}


最佳答案

查看完整内容

正好临界的时候 利润i1:10万元 奖金s1: 10*0.1=1万元 i2:20 s2: 10*0.075+1=1.75 i3:40 s3: 20*0.05+1.75=2.75 i4:60 s4: 20*0.03+2.75=3.35 i5:100 s5: 40*0.01+3.35=3.75 以上是正好临界时的数据吧 再打个草稿 if i
发表于 2012-9-12 21:27:30 | 显示全部楼层
本帖最后由 zynpc 于 2012-9-28 10:05 编辑

正好临界的时候
利润i1:10万元    奖金s1:   10*0.1=1万元
i2:20           s2:  10*0.075+1=1.75
i3:40           s3:  20*0.05+1.75=2.75
i4:60           s4:  20*0.03+2.75=3.35
i5:100          s5:  40*0.01+3.35=3.75
以上是正好临界时的数据吧
再打个草稿
if i<=10   s=i*0.1
else  if i<=20  s=1+(i-10)*0.075
       else if  i<=40   s=1.75+(i-20)*0.075
             else if i<=60 s=2.75+(i-40)*0.05
                  else if i<=100  s=3.35+(i-60)*0.03
                         else s=3.75+(i-100)*0.01
最后将相关的值代入:
#include <stdio.h>
int main()
{long int s,i,s1,s2,s3,s4,s5,i1,i2,i3,i4,i5;
i1=100000;s1=i1*0.1;
i2=200000;s2=s1+(i2-i1)*0.075;
i3=400000;s3=s2+(i3-i2)*0.05;
i4=600000;s4=s3+(i4-i3)*0.03;
i5=1000000;s5=s4+(i5-i4)*0.015;


scanf("%ld",&i);
if (i<=100000)   s=i*0.1;
else  {if (i<=200000)  s=s1+(i-100000)*0.075;
       else {if  (i<=400000)   s=s2+(i-200000)*0.05;
             else {if (i<=600000) s=s3+(i-400000)*0.03;
                  else {if (i<=1000000)  s=s4+(i-600000)*0.015;
                         else s=s5+(i-1000000)*0.01;}}}}
printf("奖金=%ld",s);

        
        sleep(5000);
        return 0;
}
鼠标好难用.JPG
发表于 2012-9-13 12:09:06 | 显示全部楼层
#include <stdio.h>
int main()
{        
    long int i,num=0;
   
    scanf("%ld",&i);
    switch((i-1)/100000)
    {
    default:num+=(i-1000000)*0.01;
                        i=1000000;
    case 9:
    case 8:
    case 7:
    case 6:num+=(i-600000)*0.015;
                   i=600000;
    case 5:
    case 4:num+=(i-400000)/10/10*3;
                   i=400000;
    case 3:
    case 2:num+=(i-200000)*0.05;
                   i=200000;
    case 1:num+=(i-100000)/10/10/10*75;
                   i=100000;
    case 0:num+=i*0.1;      
    }
      
    printf("%ld",num);
        
    sleep("puase");
        return 0;
}
发表于 2012-9-13 12:09:45 | 显示全部楼层
(i-400000)*0.03会出错
求解释
发表于 2012-9-13 12:38:09 | 显示全部楼层

现在是完整版本了

本帖最后由 Wuya 于 2012-9-14 09:15 编辑

其实,你的问题是一个分段函数。
因此,弄清楚每一个分段情况的提成是解决问题的关键。
我们把问题转化为数学函数模型,如下列表:

                I <= 10W      I0 = I * 10%
  10W < I <= 20W      I1 = I0 + ( I - 10W ) * 7.5%
  20W < I <= 40W      I2 = I1 + ( I - 20W ) * 5%
  40W < I <= 60W      I3 = I2 + ( I - 40W ) * 3%
  60W < I <= 100W    I4 = I3 + ( I - 60W ) * 1.5%
100W < I                   I5 = I4 + ( I - 100W ) * 1%

   说明: I 是问题中企业的利润
                 I0 ~ I5 是相应分段的提成
                 W 是单位万元的特写  

根据问题的分段性,我们使用多重选择 switch 语句将更加方便。

实现方法:
===============
#include <stdio.h>
#define W 100000
#define B 10000                //              I <= 10W          I0 = W*0.1
#define C 17500                //  10W < I <= 20W          I1 = W*0.1 + W*0.075
#define D 27500                //  20W < I <= 40W          I2 = W*0.1 + W*0.075 + 2*W*0.05
#define E 33500                //  40W < I <= 60W          I3 = W*0.1 + W*0.075 + 2*W*0.05 + 2*W*0.03
#define F 39500                //  60W < I <= 100W        I4 = W*0.1 + W*0.075 + 2*W*0.05 + 2*W*0.03 + 4*W*0.015


int main()
{
        long i;
        float sum;

        while ( scanf("%d", &i) ) {   
                sum = 0;
                switch( ( i -1 ) / W ) {
                        case 0: sum += i * 0.1;
                                break;
                        
                        case 1: sum += B + ( i - W ) * 0.075;
                                break;

                        case 2:
                        case 3: sum += C + ( i - 2*W ) * 0.05;
                                break;

                        case 4:
                        case 5: sum += D + ( i - 4*W ) * 0.03;
                                break;

                        case 6:     
                        case 7:
                        case 8:      
                        case 9: sum += E + ( i - 6*W ) * 0.015;
                                break;

                        default: sum += F + ( i - 10*W ) * 0.01;
                                break;
                }
                        printf("---------------\n利润:%d元\n", i);
                        printf("奖金:%.2f元\n\n\n", sum);
       }

        sleep(5000);
        return 0;
}

 楼主| 发表于 2012-9-13 17:48:22 | 显示全部楼层
我想问  switch 作用是自动用符合条件的选项吗
如:switch
    1:XXXXXX
    2:XXXXXX
    3:XXXXXX

另外运行其中一个选项后  I加到合符第二选项的条件的话
会再运行第二选项吗?
 楼主| 发表于 2012-9-13 18:07:25 | 显示全部楼层
本帖最后由 tom075395 于 2012-9-13 22:03 编辑

long int I,q;
double sum;
    scanf("%ld",&I);
        if(I<=100000) q=I,sum=I*0.1+q;

        if(I>100000 && I<200000) q=I,sum=I*0.075+q;

        if(I>200000 && I<400000) q=I,sum=I*0.05+q;

        if(I>400000 && I<600000) q=I,sum=I*0.03+q;

        if(I>600000 && I<1000000) q=I,sum=I*0.15+q;
        printf("%lf",sum);

    sleep("puase");

上面的编码OK了
but下面的编码未OK



long int I,q;
    scanf("%ld",&I);
        switch(I)
    {
    case 1I<=100000) q=I,I=I*0.1+q;break
    case 2I>100000 && I<200000) q=I,I=I*0.075+q;break
    case 3I>200000 && I<400000) q=I,I=I*0.05+q;break
    case 4I>400000 && I<600000) q=I,I=I*0.03+q;break
    case 5I>600000 && I<1000000) q=I,I=I*0.15+q;break}
    printf("%d",I);
        sleep("puase");
发表于 2012-9-23 21:33:45 | 显示全部楼层
tom075395 发表于 2012-9-13 18:07
long int I,q;
double sum;
    scanf("%ld",&I);

switch 语句的使用方法,
switch( ) 取括号内参数或表达式的值,然后在 {} 内搜索 case 标签列表,并与之比较,
如果有相匹配的 case 标签,就执行所有在匹配标签后面的语句。所以在每个 case 标签后面应该加上 break 语句。
发表于 2012-9-28 20:10:23 | 显示全部楼层
是否要用到高中的分段函数呢~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表