某国个人所得税法规定,普通公民的主要应纳税收入项目及纳税金额如下:
工资、薪金所得。按月计算征税,以每月收入额减除费用800元后的余额作为该月应纳税所得额,税率如下表所示:
一次性劳动报酬所得。按次计算征税,每次不超过4000元的,减除费用800元;4000元以上的,减除20%的费用,余额为应纳税所得额。征税税率如下表所示:
由上面可以看出,个人工资、薪金及一次性劳动报酬所得都是按照超额累进税率来征税的。超额累进税率将应纳税所得额按数额大小分成若干等级,每一等级规定一个税率,税率依次提高,但每一纳税人的的应纳税所得额依照所属等级同时适用几个税率分别计算,将计算结果相加后的总额作为应纳税款。
例如,某人某月工资总额为3800元,减去800元后,应纳税所得额为3000元。其中1级500元,2级1500元,3级1000元,税率分别为5%、10%、15%,应纳税总额为5005%+150010%+1000*15%=325(元)。计算过程如下图所示。
现在需要你编一程序,根据该国某公司的所有职员一年内的各项收入信息(收入项目、收入时间、收入金额)计算该公司所有职员这一年应交纳的个人所得税总额。
输入:
输入文件的第一行为一个正整数M(M<=50000),表示该公司的职员总数(职员编号依次为1,2,…,M)。接下来的各行每行表示一年内某一个职员的一项收入信息。具体格式如下:
工资、薪金收入信息:PAY 职员编号 收入时间 收入金额
一次性劳务报酬收入信息:INCOME 职员编号 收入时间 收入金额
其中,收入时间格式为:MM/DD,MM表示月份(1<=MM<=12),DD表示日期(1<=DD<=31);收入金额是一个正整数(单位:元),并假设每人每项收入金额小于100万元。
输入文件以字符“#”表示结束。输入文件中同一行相邻两项之间用一个或多个空格隔开。
输出:
输出文件只有一个正数P,P表示该公司所有职员一年内应交纳的个人所得税总额(单位:元),保留1位小数。
样例输入:
2
PAY 1 2/23 3800
INCOME 2 4/8 4010
INCOME 2 4/18 800
PAY 1 8/14 6700
PAY 1 8/10 1200
PAY 2 12/10 20000
样例输出:
5476.6
浅析:
题目很复杂,很长,但也没啥用,只要知道PAY的是按月计算,相同月的要加起来一起算,错了好几次这里,INCOME的要按次计算就行了,模拟一下就OK了。
#include <bits/stdc++.h>
#include <string>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
typedef struct node
{
string name;
int x;
string riqi;
int qian;
}node;
node aa[50005];
int sum[50005][13];
int n,m;
string s,ss;
int main()
{
//ios::sync_with_stdio(false);
//memset(w,0,sizeof(w));
cin>>m;
int i = 0;
while(1)
{
cin>>s;
if(s[0] == '#')
{
break;
}
aa[i].name = s;
cin>>aa[i].x>>aa[i].riqi>>aa[i].qian;
i++;
}
//cout<<"11111"<<endl;
for(int p = 1;p <= m;p ++)
{
for(int j = 0;j < i;j ++)
{
if(aa[j].name[0] == 'P' && aa[j].x == p)
{
if(aa[j].riqi[1] == '/')
{
sum[p][aa[j].riqi[0] - '0']+=aa[j].qian;
}
else
{
sum[p][aa[j].riqi[1] - '0'+10]+=aa[j].qian;
}
}
}
}
double ans = 0;
for(int j = 0;j < i;j ++)
{
if(aa[j].name[0] == 'I')
{
double w2;
if(aa[j].qian<=4000) w2=aa[j].qian-800;
else w2=(double)(aa[j].qian*0.8);
if(w2>0&&w2<=20000) ans+=w2*0.2;
else if(w2>0)
{
ans+=4000;
if(w2<=50000) ans+=(w2-20000)*0.3;
else
{
ans+=9000;
ans+=(w2-50000)*0.4;
}
}
}
}
//cout<<ans<<endl;
for(int i=1;i<=m;i++) //按每月加起来算的
for(int j=1;j<=12;j++)
{
if(sum[i][j]!=0)
{
double w2=(double)(sum[i][j]-800);
if(w2>0&&w2<=500) ans+=w2*0.05;
else if(w2>0)
{
ans+=25;
if(w2<=2000) ans+=(w2-500)*0.1;
else
{
ans+=150;
if(w2<=5000) ans+=(w2-2000)*0.15;
else
{
ans+=450;
if(w2<=20000) ans+=(w2-5000)*0.2;
else
{
ans+=3000;
if(w2<=40000) ans+=(w2-20000)*0.25;
else
{
ans+=5000;
if(w2<=60000) ans+=(w2-40000)*0.3;
else
{
ans+=6000;
if(w2<=80000) ans+=(w2-60000)*0.35;
else
{
ans+=7000;
if(w2<=100000) ans+=(w2-80000)*0.4;
else
{
ans+=8000;
ans+=(w2-100000)*0.45;
}
}
}
}
}
}
}
}
}
}
printf("%.1lf\n",ans);
return 0;
}
模拟一下就行了,就是麻烦,不难滴!