個人所得稅計算方法:假設(shè)起征點為k元,
超過k到k+500這部分稅率為0.05
超過k+500到k+2000這部分稅率為0.1
超過k+2000到k+5000這部分稅率為0.15
超過k+5000到k+20000這部分稅率為0.2
超過k+20000到k+40000這部分稅率為0.25
超過k+40000到k+60000這部分稅率為0.3
超過k+60000到k+80000這部分稅率為0.35
超過k+80000到k+100000這部分稅率為0.4
超過k+100000的部分的稅率為0.45
輸入:
多組測試數(shù)據(jù),每組一行,一行有兩個整數(shù)n和k
n是收入,0<= k,n <= 2e9
當(dāng)輸入0 0的時候結(jié)束
輸出:
輸出要交的稅的數(shù)額,保留2位小數(shù)
樣例輸入:
800 800
1000 800
2000 1000
0 0
樣例輸出:
0.00
10.00
75.00
題目看似很復(fù)雜,因為數(shù)據(jù)分段明顯不少,并且看似沒有關(guān)聯(lián)。
從原題目的鏈接帖子的第一頁里,你可以看到很多人寫了N多if嵌套,
程序邏輯顯得極其混亂,并且非常容易出錯,
只要看他們提交的結(jié)果都不對就知道了。
如果是你,你會怎么寫這一題的解答代碼呢?
不妨在看后面解答之前先細(xì)心想想,等你想盡辦法以后,
再看看以下的解答,也許那種恍然大悟的感覺會非常好哦!
以下先帖一段經(jīng)典if嵌套的方法并且能通過的C代碼:
#include <stdio.h>
int main(void)
{
int k,n;
while (scanf("%d%d",&n,&k),!(n==0&&k==0))//數(shù)據(jù)輸入
{
double tax = 0.0;
if( n-k <= 0 ); //使用分段函數(shù)方式計算
else if ( n-k-500 < 0 )
tax = (n-k)*0.05;
else if( n-k-2000 < 0 )
tax = 500*0.05 + (n-k-500)*0.1;
else if ( n-k-5000 < 0)
tax = 500*0.05 + (2000-500)*0.1 + (-2000+n-k)*0.15;
else if ( n-k-20000 < 0)
tax = 500*0.05 + (2000-500)*0.1 + (5000-2000)*0.15
+(n-k-5000)*0.2;
else if ( n-k-40000 < 0)
tax = 500*0.05 + (2000-500)*0.1 + (5000-2000)*0.15
+(20000-5000)*0.2 +(k-n-20000)*0.25;
else if ( n-k-60000 < 0)
tax = 500*0.05 + (2000-500)*0.1 + (5000-2000)*0.15
+(20000-5000)*0.2+(40000-20000)*0.25+(n-k-40000)*0.3;
else if ( n-k-80000 < 0)
tax = 500*0.05 + (2000-500)*0.1 + (5000-2000)*0.15
+(20000-5000)*0.2+(40000-20000)*0.25+(60000-40000)*0.3
+(n-k-60000)*0.35;
else if ( n-k-100000 < 0)
tax = 500*0.05 + (2000-500)*0.1 + (5000-2000)*0.15
+(20000-5000)*0.2+(40000-20000)*0.25+(60000-40000)*0.3
+(80000-60000)*0.35+(n-k-80000)*0.4;
else
tax = 500*0.05 + (2000-500)*0.1 + (5000-2000)*0.15
+(20000-5000)*0.2+(40000-20000)*0.25+(60000-40000)*0.3
+(80000-60000)*0.35+(100000-80000)*0.4+(n-k-100000)*0.45;
printf("%.2lf\n",tax); //輸出計算結(jié)果
}
return 0;
}
首先要聲明,帖此代碼并不是給大家取笑,而事實上,面對這個題目,
很多初學(xué)者的確就是使用類似以上代碼的變形(帖子里還有比這個更長的),
但偶認(rèn)為他(她)們也的確思考過,只是實在覺得沒有辦法化簡了。
偶也曾經(jīng)見過有人寫一個解24點游戲的程序,24點游戲就是給你四個數(shù),
通過加入四則運算符和括號,使得表達(dá)式的值為24。
這個解24點游戲的程序需要全排列和運算符和括號窮舉,對于初學(xué)者的確不容易。
那個人也挺“聰明”的,他知道四個數(shù)的排列不過24種,
三個符號的排列不過4^3=64種,括號不過5種,最多也不過24*64*5=7680種,
當(dāng)中一些重復(fù)的,去掉后大約二三千種,于是他一種寫一個if,
最后代碼寫了六七千行,也的確順利地解決了。
這種方法也不失為一種算法,或者可以稱為源代碼級別窮舉算法吧。
偶看到那個程序的代碼的時候,不得不Orz程序作者的毅力。
但是,我們?yōu)槭裁匆獙W(xué)算法?這個題目就回答了這個問題的一個方面:
好的算法可以讓你的代碼更清晰明了,更簡短優(yōu)美,
還有在代碼有問題的時候也能夠更容易發(fā)現(xiàn)錯誤的地方。
現(xiàn)在不講那個24點,轉(zhuǎn)回這個題目。你現(xiàn)在想到好辦法了沒有?
我們來簡單一點,先考慮收n<=5000元,k=0的情況,有如下信息:
超過k到k+500這部分稅率為0.05
超過k+500到k+2000這部分稅率為0.1
超過k+2000到k+5000這部分稅率為0.15
其實我們完全可以不要按照字面的邏輯來進(jìn)行程序的分界,
我們可以把它們打亂。比如,
k+500到k+2000這部分,相當(dāng)于征收兩次稅,且均為0.05
k+2000到k+5000這部分,相當(dāng)于征收三次稅,且均為0.05
那么原題目等價地?fù)Q為:
超過k這部分需征收一次,稅率為0.05
超過k+500這部分需再次征收,稅率為0.05
超過k+2000這部分需再次征收,稅率為0.05
結(jié)果全部均變?yōu)?.05,很合理地,我們想到循環(huán),重復(fù)地做同一個東西。
于是,你現(xiàn)在再想想,還需要不需要寫那么多的if語句呢?
并且if寫得越多、寫得越復(fù)雜就算容易錯。我們需要一段簡短漂亮的代碼。
相信說到這里,您也差不多甚至已經(jīng)想到解決辦法了。
如果你已經(jīng)想到了,那恭喜你!!
本文導(dǎo)航
- 第1頁: 首頁
- 第2頁: 個人所得稅計算標(biāo)準(zhǔn)解答程序