官方题解 | #个人所得税计算程序#

个人所得税计算程序

http://www.nowcoder.com/practice/afd6c29943c54453b2b5e893653c627e

预备知识

  • set 容器
使用 set 容器存储的各个键值对,要求键 key 和值 value 必须相等。基于 set 容器的这种特性,当使用 set 容器存储键值对时,只需要为其提供各键值对中的 value 值(也就是 key 的值)即可。map、multimap 容器都会自行根据键的大小对存储的键值对进行排序,set 容器也会如此,只不过 set 容器中各键值对的键 key 和值 value 是相等的,根据 key 排序,也就等价为根据 value 排序。
本题中可能需要使用的 set 方法:

成员方法

功能

begin()

返回指向容器中第一个(注意,是已排好序的第一个)键值对的双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。

end()

返回指向容器最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和 begin() 结合使用。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。

find(key)

在 map 容器中查找键为 key 的键值对,如果成功找到,则返回指向该键值对的双向迭代器;反之,则返回和 end() 方法一样的迭代器。另外,如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。

empty()

若容器为空,则返回 true;否则 false。

size()

返回当前 map 容器中存有键值对的个数。

insert()

向 map 容器中插入键值对。

  • set 自定义元素排序
创建 set 容器时,泛型中的第二个模板参数可以设置排序规则,默认规则是 less<_Kty>,如果想自定义排序规则,可以使用仿函数。
class MyCompare{
    bool operator()(int v1,int v2){
        return v1 > v2;
    }
};

int main() {
    set<int, MyCompare> s;
    // ...
    return 0;
}
  • 遍历算法
/*
    遍历算法 遍历容器元素
    @param beg 开始迭代器
    @param end 结束迭代器
    @param _callback  函数对象
*/
for_each(iterator beg, iterator end, _callback);

思路、步骤

  • 设计员工类(Employee)
    • 成员变量:姓名(string name),工资(int salary)
    • 成员方法:构造方法、公共的访问方法
  • 创建 set 容器对象,set<Employee,myCompare> s; 第一个模板参数指定容器中的元素类型 Employee,第二个参数为自定义排序规则,这里采用仿函数实现,该仿函数按照工资由高到底的顺序排序:
class myCompare {
public:
    bool operator()(const Employee& e1, const Employee& e2) const {
        return e1.getSalary() > e2.getSalary();
    }
};
  1. 按照要求创建 3 个 Employee 对象
  2. 使用 set 的 insert() 方法添加元素
  3. 使用 for_each(iterator beg, iterator end, _callback); 对 set 容器对象进行遍历,遍历的过程中根据规则计算出应纳税额并输出。 

代码实现

#include <iostream>
#include <set>
#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;
    }

    void setName(string name) {
        this->name = name;
    }

    int getSalary() const {
        return salary;
    }

    void setSalary(int salary) {
        this->salary = salary;
    }

};

class myCompare {
public:
    bool operator()(const Employee& e1, const Employee& e2) const {
        return e1.getSalary() > e2.getSalary();
    }
};

int main() {

    set<Employee,myCompare> s;
    Employee e1("张三", 6500);
    Employee e2("李四", 8000);
    Employee e3("王五", 100000);

    s.insert(e1);
    s.insert(e2);
    s.insert(e3);

    for_each(s.begin(), s.end(), [](Employee e) {
            double tax = 0.0;
            double taxIncome = e.getSalary() - 3500;
            if (taxIncome <= 0) {
                tax = 0.0;
            }
            else if (taxIncome <= 1500) {
                tax = taxIncome * 0.03;
            }
            else if (taxIncome <= 4500) {
                tax = taxIncome * 0.10 - 105;
            }
            else if (taxIncome <= 9000) {
                tax = taxIncome * 0.20 - 555;
            }
            else if (taxIncome <= 35000) {
                tax = taxIncome * 0.25 - 1005;
            }
            else if (taxIncome <= 55000) {
                tax = taxIncome * 0.30 - 2755;
            }
            else if (taxIncome <= 80000) {
                tax = taxIncome * 0.35 - 5505;
            }
            else {
                tax = taxIncome * 0.45 - 13505;
            }
            cout<<fixed<<setprecision(1);
            cout << e.getName() << "应该缴纳的个人所得税是:" << tax << endl;
        });
 
    return 0;
}
全部评论

相关推荐

12-15 11:27
门头沟学院 Java
哇哇的菜鸡oc:所有人不要理会,就好了,后面他就知道怎么回事了,只能说有的时候市场都是被宰的人搞坏的
点赞 评论 收藏
分享
最近群里有很多同学找我看简历,问问题,主要就是集中在明年三月份的暑期,我暑期还能进大厂嘛?我接下来该怎么做?对于我来说,我对于双非找实习的一个暴论就是title永远大于业务,你在大厂随随便便做点慢SQL治理加个索引,可能就能影响几千人,在小厂你从零到一搭建的系统可能只有几十个人在使用,量级是不一样的。对双非来说,最难的就是约面,怎么才能被大厂约面试?首先这需要一点运气,另外你也需要好的实习带给你的背书。有很多双非的同学在一些外包小厂待了四五个月,这样的产出有什么用呢?工厂的可视化大屏业务很广泛?产出无疑是重要的,但是得当你的实习公司到了一定的档次之后,比如你想走后端,那么中厂后端和大厂测开的选择,你可以选择中厂后端(注意,这里的中厂也得是一些人都知道的,比如哈啰,得物,b站之类,不是说人数超过500就叫中厂),只有这个时候你再去好好关注你的产出,要不就无脑大厂就完了。很多双非同学的误区就在这里,找到一份实习之后,就认为自己达到了阶段性的任务,根本不再投递简历,也不再提升自己,玩了几个月之后,美其名曰沉淀产出,真正的好产出能有多少呢?而实际上双非同学的第一份实习大部分都是工厂外包和政府外包!根本无产出可写😡😡😡!到了最后才发现晚了,所以对双非同学来说,不要放过任何一个从小到中,从中到大的机会,你得先有好的平台与title之后再考虑你的产出!因为那样你才将将能过了HR初筛!我认识一个双非同学,从浪潮到海康,每一段都呆不久,因为他在不断的投递和提升自己,最后去了美团,这才是双非应该做的,而我相信大部分的双非同学,在找到浪潮的那一刻就再也不会看八股,写算法,也不会打开ssob了,这才是你跟别人的差距。
迷茫的大四🐶:我也这样认为,title永远第一,只有名气大,才有人愿意了解你的简历
双非本科求职如何逆袭
点赞 评论 收藏
分享
12-27 22:29
门头沟学院 Java
点赞 评论 收藏
分享
评论
5
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务