题目的主要信息:
- 个人所得税的计算公式为:应纳税额=(工资薪金所得-扣除数)×适用税率-速算扣除数。
- 其中,扣除数为3500元,适用税率以及速算扣除数如下表所示:
- 全月应纳税所得额=工资薪金所得-扣除数
- 请你补全代码中的 Employee 类,新建三个 Employee 对象,姓名分别是张三,李四和王五,他们的工资分别为 6500,8000,100000
- 并将他们存入一个 STL 容器中,要求按照工资由高到底的顺序排序,遍历容器并计算他们应缴纳的个人所得税
- 个人所得税为 double 类型,保留一位小数
具体做法:
这道题看起来很复杂,但是其实只需要分几步走。
-
补全Emplyee类,它的成员变量是private类型的,因此我们需要构造函数对其初始化,还要分别访问姓名和工资的方法,都是public类型的。
-
新建三个Employee类的对象,对其分别赋予初始值,然后将它们全部存入vector数组中。
-
重载sort函数的大小比较,使其比较salary较大的返回1,这里要使用获取salary的方法。利用重载函数和sort函数对vector数组排序。
-
利用for_each函数遍历vector数组,将取出来的值放入print函数中准备计算输出。
-
print函数中先计算全月应纳税所得额,然后根据这个数所在的区间计算应纳税额,最后输出。
#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),常数空间