CCF 201612-2工资计算 (100分)
程序员文章站
2022-06-07 10:28:26
...
(1)题目描述
(2)算法思想
本质上就是初中学的分段函数,可以计算各情况下税后工资的值域,判断当前工资的范围进而进行还原。
不过本题比较特殊规定了税前工资整百的特性并且有一个最大值,这使得我们可以按照正向计算的方式穷举出税前工资。这个条件是我在敲完后才发现的所以便没有额外实现,实现起来应该比反向要简单。
(3)代码实现
#include<iostream>
using namespace std;
int main() {
double sum[7]= {0};
double tax[7]= {0};
double bound[7]= {0};
double rate[8]= {0,0.03,0.1,0.2,0.25,0.3,0.35,0.45};
double rand[7]= {3500,1500,3000,4500,26000,20000,25000};
for(int i=0; i<7; i++) {
if(i!=0) {
sum[i]+=sum[i-1];
tax[i]+=tax[i-1];
bound[i]+=bound[i-1];
}
sum[i]+=rand[i];
tax[i]+=rand[i]*rate[i];
bound[i]+=rand[i]*(1.0-rate[i]);
}
double T,S;
cin>>T;
for(int i=0; i<7; i++) {
if(T<bound[i]) {
S=(T+tax[i-1]-sum[i-1]*rate[i])/(1-rate[i]);
break;
}
if(i==6)
S=(T+tax[6]-sum[6]*rate[7])/(1-rate[7]);
}
cout<<S;
return 0;
}
附正向计算代码(可用于验证)
#include<iostream>
using namespace std;
int main() {
double S;
double rate[8]= {0,0.03,0.1,0.2,0.25,0.3,0.35,0.45};
double rand[8]= {3500,1500,3000,4500,26000,20000,25000,100000};
while(cin>>S) {
double temp=S;
for(int i=0; i<7; i++) {
temp-=rand[i];
if(temp>=0) {
S-=rand[i]*rate[i];
if(temp<rand[i+1]) {
S-=temp*rate[i+1];
break;
}
}
}
cout<<S<<endl;
}
return 0;
}
上一篇: 武则天疑心儿子谋反,李旦却因此逃过一劫
下一篇: 实验9-1 计算职工工资 (15分)