申請SAE

如果您發現本博客的外觀很難看,那是因為部分外觀文件被中國.國家.防火.牆屏.蔽所致!
請翻~牆!

我的Wordpress博客的地址: http://zhuyf.tk/

2011年11月4日 星期五

NOI1998 個人所得稅 personaltax 解題報告

【題目描述】
某國個人所得稅法規定,普通公民的主要應納稅收入項目及納稅金額如下:
工資、薪金所得。按月計算徵稅,以每月收入額減除費用800元后的餘額作爲該月應納稅所得額,稅率如下表所示:
級數 月應納稅所得額 稅率(%)
1 不超過500元的 5
2 超過500元~2000元的部分 10
3 超過2000元~5000元的部分 15
4 超過5000元~20000元的部分 20
5 超過20000元~40000元的部分 25
6 超過40000元~60000元的部分 30
7 超過60000元~80000元的部分 35
8 超過80000元~100000元的部分 40
9 超過100000元的部分 45


一次性勞動報酬所得。按次計算徵稅,每次不超過4000元的,減除費用800元;4000元以上的,減除20%的費用,餘額爲應納稅所得額。徵稅稅率如下表所示:
級數 每次應納稅所得額 稅率(%)
1 不超過20000元的部分 20
2 超過20000元~50000元的部分 30
3 超過50000元的部分 40
由上面可以看出,個人工資、薪金及一次性勞動報酬所得都是按照超額累進稅率來徵稅的。超額累進稅率將應納稅所得額按數額大小分成若乾等級,每一等級 規定一個稅率,稅率依次提高,但每一納稅人的的應納稅所得額依照所屬等級同時適用幾個稅率分別計算,將計算結果相加後的總額作爲應納稅款。
例如,某人某月工資總額爲3800元,減去800元后,應納稅所得額爲3000元。其中1級500元,2級1500元,3級1000元, 稅率分別爲5%、10%、15%,應納稅總額爲500*5%+1500*10%+1000*15%=325(元)。現在需要你編一程序,根據該國某公司的 所有職員一年內的各項收入信息(收入項目、收入時間、收入金額)計算該公司所有職員這一年應交納的個人所得稅總額。
輸入
輸入文件的第一行爲一個正整數M(M<= 50000),表示該公司的職員總數(職員編號依次爲1,2,…,M)。接下來的各行每行表示一年內某一個職員的一項收入信息。具體格式如下: 工資、薪金收入信息:PAY 職員編號 收入時間 收入金額
一次性勞務報酬收入信息:INCOME 職員編號 收入時間 收入金額
其中,收入時間格式爲:MM/DD,MM表示月份(1<= MM<=12),DD表示日期(1<= DD<=31);收入金額是一個正整數(單位:元),並假設每人每項收入金額小於100萬元。
輸入文件以字符“#”表示結束。輸入文件中同一行相鄰兩項之間用一個或多個空格隔開。
輸出
輸出文件只有一個正數P(保留兩位小數),P表示該公司所有職員一年內應交納的個人所得稅總額(單位:元)。
樣例輸入
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.60

【分析】
又是一道NOI的水題啊~這道題不需要什麼算法或者數據結構,模擬即可。
讀題時應注意:工資、薪金所得是按月計算,一次性勞動報酬所得是按此次計算,所以說,輸入數據中給的日期對於一次性勞動報酬所得的計算沒有任何作用,而對於工資、薪金所得是按月來說,只有月份有用而日無用。所以讀入時應忽略干擾數字。用C++/C中的scanf()函數很容易做到這一點。

剩下的就很簡單了,就是初中時學習的分段函數,只要看清題目就不會出錯。

【代碼】
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int M;

class PAY
{
public:
    int Mon[13];
    double TP;
    double TI;
    PAY()
    {
        for (int i=1;i<=12;i++)
            Mon[i]=0;
        TP=0;
        TI=0;
    }
}PE[50001];


double Jianzhi(int Num)
{
    double MM=0;
    double NN=Num;
    if(Num<=800)
        return MM;
   
    if(Num<=4000)
        NN=NN-800;
    else
    {
        NN=NN-NN/5;
    }
   
    if(NN<=20000)
    {
        MM=NN/5;
        return MM;
    }
   
    if(NN<=50000)
    {
        MM=4000;
        NN=NN-20000;
        MM=MM+NN*0.3;
        return MM;
    }
   
    MM=4000+9000;
    NN=NN-50000;
    MM=MM+NN*0.4;
    return MM;
}


double Gongzi(int Num)
{
    double NN=Num;
    double MM=0;
    if(Num<=800)
    {
        return MM;
    }
   
    NN=NN-800;
   
    if(NN<=500)
    {
        MM=NN/20;
        return MM;
    }
   
    if(NN<=2000)
    {
        MM=25;
        NN=NN-500;
        MM=MM+NN*0.1;
        return MM;
    }
   
    if(NN<=5000)
    {
        MM=175;
        NN=NN-2000;
        MM=MM+NN*0.15;
        return MM;
    }
   
    if(NN<=20000)
    {
        MM=625;
        NN-=5000;
        MM=MM+NN*0.2;
        return MM;
    }
   
    if(NN<=40000)
    {
        MM=3625;
        NN-=20000;
        MM=MM+NN*0.25;
        return MM;
    }
   
    if(NN<=60000)
    {
        MM=8625;
        NN-=40000;
        MM=MM+NN*0.3;
        return MM;
    }
   
    if(NN<=80000)
    {
        MM=14625;
        NN-=60000;
        MM=MM+NN*0.35;
        return MM;
    }
   
    if(NN<=100000)
    {
        MM=21625;
        NN-=80000;
        MM=MM+NN*0.4;
        return MM;
    }
   
    MM=29625;
    NN-=100000;
    MM=MM+NN*0.45;
    return MM;
}

void init()
{
    string PAY="PAY";
    string INCOME="INCOME";
    scanf("%d\n",&M);
    string P;
    P.clear();
    cin>>P;
    int Peo;
    int Mon;
    int Day;
    int Money;
   
    while(P[0]!='#')
    {
        if(P==PAY)
        {
            scanf("%d %d/%d %d",&Peo,&Mon,&Day,&Money);
            PE[Peo].Mon[Mon]+=Money;
        }
        if(P==INCOME)
        {
            scanf("%d %d/%d %d",&Peo,&Mon,&Day,&Money);
            PE[Peo].TI=PE[Peo].TI+Jianzhi(Money);
        }
        cin>>P;
    }
   
    for (int i=1;i<=M;i++)
    {
        for (int j=1;j<=12;j++)
        {
            if(PE[i].Mon[j]!=0)
                PE[i].TP+=Gongzi(PE[i].Mon[j]);
        }
    }
   
    double Tot=0;
    for (int i=1;i<=M;i++)
    {
        Tot+=PE[i].TP;
        Tot+=PE[i].TI;
    }
    //cout<<Tot<<endl;
    printf("%.2lf\n",Tot);
}

int main()
{
    freopen("personaltax.in","r",stdin);
    freopen("personaltax.out","w",stdout);
    init();
    return 0;
}

沒有留言:

張貼留言