1. 程式人生 > >CCF — 工資計算(python實現:100分)

CCF — 工資計算(python實現:100分)

2016.12.2 工資計算

目錄

前言

前言

最近我在做CCF的題目,也打算把每道題的解題思路都寫到部落格上來,希望能幫助到也在做CCF題目的讀者們,希望你們通過本文能有所提示,幫助大家提升程式設計能力。另外有個很好的想法就是,建議讀者們可以先看一下問題分析這一部分,然後自己再整理一下思路,重新做一遍,最後再參考程式碼,我想這樣會更有收穫。

一、問題描述

問題描述

小明的公司每個月給小明發工資,而小明拿到的工資為交完個人所得稅之後的工資。假設他一個月的稅前工資(扣除五險一金後、未扣稅前的工資)為S元,則他應交的個人所得稅按如下公式計算:

1) 個人所得稅起徵點為3500元,若S

不超過3500,則不交稅,3500元以上的部分才計算個人所得稅,令A=S-3500元;

2) A中不超過1500元的部分,稅率3%;

3) A中超過1500元未超過4500元的部分,稅率10%;

4) A中超過4500元未超過9000元的部分,稅率20%;

5) A中超過9000元未超過35000元的部分,稅率25%;

6) A中超過35000元未超過55000元的部分,稅率30%;

7) A中超過55000元未超過80000元的部分,稅率35%;

8) A中超過80000元的部分,稅率45%;

例如,如果小明的稅前工資為10000元,則A=10000-3500=6500元,其中不超過1500元部分應繳稅1500×3%=45元,超過1500元不超過4500元部分應繳稅(4500-1500)×10%=300元,超過4500元部分應繳稅(6500-4500)×20%=400元。總共繳稅745元,稅後所得為9255元。

已知小明這個月稅後所得為T元,請問他的稅前工資S是多少元。

輸入格式

輸入的第一行包含一個整數T,表示小明的稅後所得。所有評測資料保證小明的稅前工資為一個整百的數。

輸出格式

輸出一個整數S,表示小明的稅前工資。

樣例輸入

9255

樣例輸出

10000

評測用例規模與約定

對於所有評測用例,1 ≤ T ≤ 100000。

二、問題分析

這道題目需要提前計算一下每個稅率區間的交稅情況,大致瞭解一下,然後逆推過去就行了,主要的解題思路如下:

主要就是要算出每個區間的最大稅後工資金額,計算的邏輯還是蠻簡單的,自己推一下就知道了。接著就迴圈找出輸入的稅後工資在哪個區間,這裡值得注意的是遍歷len(T)+1次(具體可以看下程式,因為這道題不知道怎麼說才能更好的表達出來),然後對最後一個值進行判斷就行了,讓它直接跳出迴圈;為什麼要這麼做呢?主要是因為之前用Java寫過,Java的遍歷是當 i 的值超過遍歷範圍才退出,而python的遍歷不是這樣的,比如你寫 for i in range(0,7) ,i 的值只到6,而Java是到7才退出。然後+1操作就為了能計算超過最後那個區間的稅後金額的情況。

其餘部分應該比較容易理解,這裡就不詳說了。

三、程式說明

r:儲存稅率的列表

S:儲存每個稅率區間的原工資最大值的列表

A:S減去3500剩餘的部分,即要交稅的部分

R:每個稅率區間的最大交稅金額

T:每個區間的稅後工資列表

t:輸入的稅後工資

python語言的程式如下(100分):

# 工資計算

r = [0.03, 0.1, 0.2, 0.25, 0.3, 0.35, 0.45] # 稅率
S = [3500,3500+1500,3500+4500,3500+9000,3500+35000,3500+55000,3500+80000] # 每個稅率區間的原工資最大值
A = [(i-3500) for i in S]

R = [0] # 每個稅率區間最大交稅值
temp = 0
for i in range(1,len(A)):
    temp += (A[i]-A[i-1])*r[i-1]
    R.append(temp)

T = [(S[i]-R[i]) for i in range(len(S))] # 稅後工資區間

t = int(input())
for i in range(len(T)+1):
    if i == len(T):
        break
    elif t <= T[i]:
        break
if i == 0:
    print(t)
else:
    print(int(S[i-1]+(t-T[i-1])/(1-r[i-1])))