工资计算

问题描述
  小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资。假设他一个月的税前工资(扣除五险一金后、未扣税前的工资)为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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值