怎样优雅的实现这个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,求应发放奖金总数?
#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;} 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);} #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));}
[解决办法]
#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;
}
[解决办法]
如果不要求效率,这样子写比较适合,用递归蛮好的:
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的整数倍,