欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CCF 201612-2工资计算 (100分)

程序员文章站 2022-06-07 10:28:26
...

(1)题目描述

CCF 201612-2工资计算 (100分)

(2)算法思想

本质上就是初中学的分段函数,可以计算各情况下税后工资的值域,判断当前工资的范围进而进行还原。

不过本题比较特殊规定了税前工资整百的特性并且有一个最大值,这使得我们可以按照正向计算的方式穷举出税前工资。这个条件是我在敲完后才发现的所以便没有额外实现,实现起来应该比反向要简单。

(3)代码实现

#include<iostream>
using namespace std;

int main() {
	double sum[7]= {0};
	double tax[7]= {0};
	double bound[7]= {0};
	double rate[8]= {0,0.03,0.1,0.2,0.25,0.3,0.35,0.45};
	double rand[7]= {3500,1500,3000,4500,26000,20000,25000};
	for(int i=0; i<7; i++) {
		if(i!=0) {
			sum[i]+=sum[i-1];
			tax[i]+=tax[i-1];
			bound[i]+=bound[i-1];
		}
		sum[i]+=rand[i];
		tax[i]+=rand[i]*rate[i];
		bound[i]+=rand[i]*(1.0-rate[i]);
	}
	double T,S;
	cin>>T;
	for(int i=0; i<7; i++) {
		if(T<bound[i]) {
			S=(T+tax[i-1]-sum[i-1]*rate[i])/(1-rate[i]);
			break;
		}
		if(i==6)
			S=(T+tax[6]-sum[6]*rate[7])/(1-rate[7]);
	}
	cout<<S;
	return 0;
}

附正向计算代码(可用于验证)

#include<iostream>
using namespace std;

int main() {
	double S;
	double rate[8]= {0,0.03,0.1,0.2,0.25,0.3,0.35,0.45};
	double rand[8]= {3500,1500,3000,4500,26000,20000,25000,100000};
	while(cin>>S) {
		double temp=S;
		for(int i=0; i<7; i++) {
			temp-=rand[i];
			if(temp>=0) {
				S-=rand[i]*rate[i];
				if(temp<rand[i+1]) {
					S-=temp*rate[i+1];
					break;
				}
			}
		}
		cout<<S<<endl;
	}
	return 0;
}
相关标签: CCF c++ 算法