问题描述
小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资。假设他一个月的税前工资(扣除五险一金后、未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算:
1) 个人所得税起征点为3500元,若S不超过3500,则不交税,3500元以上的部分才计算个人所得税,令A=S-3500元;
2) A中不超过1500元的部分,税率3%;
3) A中超过1500元未超过4500元的部分,税率10%;
4) A中超过4500元未超过9000元的部分,税率20%;
5) A中超过9000元未超过35000元的部分,税率25%;
6) A中超过35000元未超过55000元的部分,税率30%;
7) A中超过55000元未超过80000元的部分,税率35%;
8) A中超过80000元的部分,税率45%;
例如,如果小明的税前工资为10000元,则A=10000-3500=6500元,其中不超过1500元部分应缴税1500×3%=45元,超过1500元不超过4500元部分应缴税(4500-1500)×10%=300元,超过4500元部分应缴税(6500-4500)×20%=400元。总共缴税745元,税后所得为9255元。
已知小明这个月税后所得为T元,请问他的税前工资S是多少元。
输入格式
输入的第一行包含一个整数T,表示小明的税后所得。所有评测数据保证小明的税前工资为一个整百的数。
输出格式
输出一个整数S,表示小明的税前工资。
样例输入
9255
样例输出
10000
评测用例规模与约定
对于所有评测用例,1 ≤ T ≤ 100000。
初始程序
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
if(n-3500>0 && n-3500<=1500)
{
cout<<(n-105)/0.97;
}
else if(n-3500>1500 && n-3500<=4500){
cout<<(n-455)/0.9;
}
else if(n-3500>4500 && n-3500<=9000){
cout<<(n-1255)/0.8;
}
else if(n-3500>9000 && n-3500<=35000){
cout<<(n-1880)/0.75;
}
else if(n-3500>35000 && n-3500<=55000){
cout<<(n-3805)/0.7;}
else if(n-3500>55000 && n-3500<=80000){
cout<<(n-6730)/0.65;
}
else if(n-3500>80000 && n-3500<=100000){
cout<<(n-15080)/0.55;
}
else cout<<n;
return 0;
}
只能通过60%,原因是算法思想是错误的,思想:因为超出部分完全减去也并不会使税后工资降级,而且题目还要乘上税率,即初始工资在4500-9000,则税后工资的范围也会大于4500,但实际上,如果只考虑两部分,超出部分需要缴税而未超出部分不需要则这样想是正确的,但此时,工资分为很多部分,超出4500的那一部分不会使税后工资和原始工资不在同一个等级,但是超出1500的那部分的税会使工资降级,因此不能直接用原始工资的等级去比较。算出范围之后只需要根据工资求税前工资的公式反推即可,比如税后工资范围在7655-11255 说明税前工资-3500在4500-9000范围内,因此税后工资n=x-1500*0.03-3000*0.1-(x-3500-4500)*0.2,则x=(n-1255)/0.8;
因此要构建属于税后工资的范围表,根据计算,获得范围为(0,3500,4955,7655,11255,30755,44755,61005,999999),则将每次判断的范围改成以上范围即可。改正后的如下,100分通过。
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
if(n-3500>0 && n-3500<=1455)
{
cout<<(n-105)/0.97;
}
else if(n-3500>1455 && n-3500<=4155){
cout<<(n-455)/0.9;
}
else if(n-3500>4155 && n-3500<=7755){
cout<<(n-1255)/0.8;
}
else if(n-3500>7755 && n-3500<=27255){
cout<<(n-1880)/0.75;
}
else if(n-3500>27255 && n-3500<=41255){
cout<<(n-3805)/0.7;}
else if(n-3500>41255 && n-3500<=57505){
cout<<(n-6730)/0.65;
}
else if(n-3500>57505 && n-3500<=66580){
cout<<(n-15080)/0.55;
}
else cout<<n;
return 0;
}
在博客上看到一种更简洁的方法,思想类似但是写法更加简洁,并且修改程序更加方便,悄咪咪贴个链接 :)
http://blog.csdn.net/tigerisland45/article/details/54799557