西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開發(fā)VC|VC++ → 個(gè)人所得稅計(jì)算代碼優(yōu)化 化繁為簡(jiǎn)

個(gè)人所得稅計(jì)算代碼優(yōu)化 化繁為簡(jiǎn)

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:本站整理時(shí)間:2010/10/3 22:58:08字體大小:A-A+

作者:佚名點(diǎn)擊:355次評(píng)論:0次標(biāo)簽: 所得稅

  • 類型:行業(yè)軟件大。1.1M語(yǔ)言:中文 評(píng)分:5.0
  • 標(biāo)簽:
立即下載
題目描述:
個(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)想到了,那恭喜你。!

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)