题目的主要信息:

  • 个人所得税的计算公式为:×应纳税额 =(工资薪金所得-扣除数)× 适用税率-速算扣除数×
  • 其中,扣除数为3500元,适用税率以及速算扣除数如下表所示: alt
  • =全月应纳税所得额 = 工资薪金所得-扣除数=
  • 请你补全代码中的 Employee 类,新建三个 Employee 对象,姓名分别是张三,李四和王五,他们的工资分别为 6500,8000,100000
  • 并将他们存入一个 STL 容器中,要求按照工资由高到底的顺序排序,遍历容器并计算他们应缴纳的个人所得税
  • 个人所得税为 double 类型,保留一位小数

具体做法:

这道题看起来很复杂,但是其实只需要分几步走。

  1. 补全Emplyee类,它的成员变量是private类型的,因此我们需要构造函数对其初始化,还要分别访问姓名和工资的方法,都是public类型的。

  2. 新建三个Employee类的对象,对其分别赋予初始值,然后将它们全部存入vector数组中。

  3. 重载sort函数的大小比较,使其比较salary较大的返回1,这里要使用获取salary的方法。利用重载函数和sort函数对vector数组排序。

  4. 利用for_each函数遍历vector数组,将取出来的值放入print函数中准备计算输出。

  5. print函数中先计算全月应纳税所得额,然后根据这个数所在的区间计算应纳税额,最后输出。

alt

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iomanip> 
using namespace std;

class Employee {

    private:
        string name; //姓名
        int salary; //工资
    public:
        Employee(string name, int salary){ //构造函数
            this->name = name;
            this->salary = salary;
        }
    
        string getName(){ //获取姓名
            return name;
        }
        int getSalary(){ //获取工资
            return salary;
        }
};

bool cmp(Employee& a, Employee& b){ //重载比较
    return a.getSalary() > b.getSalary();
}

void print(Employee& e){
    double tax = 0.0;
    double income = e.getSalary() - 3500; //工资-扣除数=全月应纳税所得额
    //找到所属区间
    if(income <= 1500)
        tax = income * 0.03;
    else if(income <= 4500)
        tax = income * 0.1 - 105;
    else if(income <= 9000)
        tax = income * 0.2 - 555;
    else if(income <= 35000)
        tax = income * 0.25 - 1005;
    else if(income <= 55000)
        tax = income * 0.3  - 2755;
    else if(income <= 80000)
        tax = income * 0.35 - 5505;
    else
        tax = income * 0.45 - 13505;
    cout<<fixed<<setprecision(1); //保留1位小数
    cout << e.getName() << "应该缴纳的个人所得税是:" << tax << endl;
}

int main() {
    //新建三个类
    Employee e1("张三", 6500);
    Employee e2("李四", 8000);
    Employee e3("王五", 100000);
    vector<Employee> v;//将信息加入vector容器
    v.push_back(e1);
    v.push_back(e2);
    v.push_back(e3);
    sort(v.begin(), v.end(), cmp); //按工资从大到小排序
    for_each(v.begin(), v.end(), print);
    return 0;
}

复杂度分析:

  • 时间复杂度:O(1)O(1)O(1),常数时间
  • 空间复杂度:O(1)O(1)O(1),常数空间