读书人

怎样优雅的实现这个C语言题目C语言经

发布时间: 2012-04-06 12:22:24 作者: rapoo

怎样优雅的实现这个C语言题目,C语言经典例题 NO.2
题目:企业发放的奖金根据利润提成。利润(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,求应发放奖金总数?

C/C++ code
#include<stdio.h>#include<stdlib.h>int main(){    long profit;    double rate1=0.1,rate2=0.075,rate3=0.05,rate4=0.03,rate5=0.015,rate6=0.01;    long reward=0;    printf("输入月利润:");    scanf("%d",&profit);        if(profit>=0&&profit<=100000)    reward=profit*rate1;    else if(profit<=200000)    reward=100000*rate1+(profit-100000)*rate2;    else if(profit<=400000)    reward=100000*rate1+100000*rate2+(profit-200000)*rate3;    else if(profit<=600000)    reward=10000*rate1+100000*rate2+200000*rate3+(profit-400000)*rate4;    else if(profit<=1000000)    reward=10000*rate1+100000*rate2+200000*rate3+200000*rate4+(profit-6000000)*rate5;    else reward=10000*rate1+100000*rate2+200000*rate3+200000*rate4+400000*rate5+(profit-1000000)*rate6;        printf("%d\n",reward);        system("pause");    return 0;} 

总觉得我写的太臃肿了,貌似用数组也改善不了多少。
标准答案也不怎么的
C/C++ code
main(){long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ld",&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15; if(i<=100000)  bonus=i*0.1; else if(i<=200000)     bonus=bonus1+(i-100000)*0.075;    else if(i<=400000)        bonus=bonus2+(i-200000)*0.05;       else if(i<=600000)           bonus=bonus4+(i-400000)*0.03;          else if(i<=1000000)              bonus=bonus6+(i-600000)*0.015;             else              bonus=bonus10+(i-1000000)*0.01;printf("bonus=%d",bonus);} 


[解决办法]
这个优雅不了。。。不要太纠结了,后边的算法还有好多好的
[解决办法]
这个要完整建模哦,有两个要素,分档点,提成
struct
{
int seg;
int radio;
} array[10]

然后再for循环进行计算
[解决办法]
好看的其实不一定好用
C/C++ code
#include <stdio.h>#include <math.h>main(){    float ratio[5][2]={{100000,0.10},{100000,0.075},{200000,0.05},{200000,0.03},{400000,0.015}};    float profit,remainder,de=0.0;    int i=0;    printf("请输入当月利润:");    scanf("%f",&profit);    remainder=profit;    do    {        if (remainder>ratio[i][0])        {            remainder=remainder-ratio[i][0];            de+=ratio[i][0]*ratio[i][1];            i++;        }        else        {            de+=remainder*ratio[i][1];            break;        }    }while(i<5);    if (profit>1000000.0)        de+=(profit-1000000.0)*0.01;    printf("应得提成总额为:%d",(int)floor(de+0.5));}
[解决办法]
C/C++ code
#include<stdio.h>#include<stdlib.h>struct A{  double d;  int n;};A SET[6]={{.01,1000000},{.015,600000},{.03,400000},{.05,200000},{.075,100000},{.10,0}};int main(){    long profit;    printf("输入月利润:");    scanf("%d",&profit);    long rate=0;    for(int i=0;i<6;i++)      rate += (profit > SET[i].n ? (profit -= SET[i].n, profit* SET[i].r) : 0);    printf("%d\n",rate);        system("pause");    return 0;}
------解决方案--------------------


#include <iostream>
using namespace std;

struct A{
double d;
int n;
int r;
};

A SET[6]={{.01,1000000,39500},{.015,600000,33500},{.03,400000,27500},{.05,200000,17500},{.075,100000,10000},{.10,0,0}};

int main()
{
int profit;
cout <<"输入月利润:";
cin >> profit;
int rate;
for(int i=0;i<6;i++)
if(profit >= SET[i].n){
rate = (profit-SET[i].n)*SET[i].d+SET[i].r;
break;}
cout << "rate = " << rate << endl;

return 0;
}
[解决办法]
如果不要求效率,这样子写比较适合,用递归蛮好的:

C/C++ code
double cal( double n ){    int i;    double spl[10] = { 100000, 200000, 400000, 600000, 1000000, -1  };    double flt[10] = { 0.01,   0.075,  0.05,   0.03,   0.015,   0.01 };    for( i=0; i<5; i++ )        if( n <= spl[i] )    break;    if( i == 0 )    return spl[i]*flt[i];    else            return cal( spl[i-1] ) + ( n-spl[i-1] )*flt[i];}int main(){    printf("%f\n", cal(1110000) );     system("pause");    return 0;};
[解决办法]
可以使用switch语句啊,由于分界点都是10的整数倍,

读书人网 >C语言

热点推荐