- #include <string>
- #include <iostream>
- #include <cfloat>
- using namespace std;
- double 税率[]={0.03,0.1,0.2,0.25,0.3,0.35,0.45};
- double 界限[]={-DBL_MAX,1500,4500,9000,35000,55000,80000,DBL_MAX};
- struct Bound
- {
- double lower;
- double upper;
- };
- int getLevels()
- {
- return sizeof(税率)/sizeof(税率[0]);
- }
- double getTaxrateByLevel(int i)
- {
- int levels=getLevels();
- i=min(max(i,1),levels);
- return 税率[i-1];
- }
- Bound getBoundByLevel(int i)
- {
- int levels=getLevels();
- i=min(max(i,1),levels);
- Bound bound;
- bound.lower=界限[i-1];
- bound.upper=界限[i];
- return bound;
- }
- double getDeductionByLevel(int i)
- {
- if(1==i)
- {
- return 0;
- }
- else
- {
- double ret=0;
- for(int n=2;n<=i;++n)
- {
- Bound bound=getBoundByLevel(n-1);
- double taxrate1=getTaxrateByLevel(n-1);
- double taxrate2=getTaxrateByLevel(n);
- ret+=bound.upper*(taxrate2-taxrate1);
- }
- return ret;
- }
- }
- bool inBound(double d,Bound bound)
- {
- const double epsilon=1.0e-8;
- if(d>bound.lower && d-bound.upper<=epsilon)
- {
- return true;
- }
- return false;
- }
- int getLevelBySalary(double 总薪资)
- {
- double 免征额=3500;
- double 其他免除=0;
- double 应纳税所得额=总薪资-免征额-其他免除;
- int levels=getLevels();
- for(int i=1;i<=levels;++i)
- {
- Bound bound=getBoundByLevel(i);
- if(inBound(应纳税所得额,bound))
- {
- return i;
- }
- }
- }
- double getTax(double 总薪资)
- {
- double 免征额=3500;
- double 其他免除=0;
- double 应纳税所得额=总薪资-免征额-其他免除;
- int level=getLevelBySalary(总薪资);
- double tax=应纳税所得额*getTaxrateByLevel(level)
- -getDeductionByLevel(level);
- return tax;
- }
- int main()
- {
- //测试
- cout<<getTax(8000)<<endl;
- cout<<getTax(9000)<<endl;
- cout<<getTax(10000)<<endl;
- cout<<getTax(90000)<<endl;
- return 0;
- }
- //该片段来自于http://www.codesnippet.cn/detail/201120137326.html
来源: http://www.codesnippet.cn/detail/201120137326.html