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])))