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