试题编号: | 201612-2 |
试题名称: | 工资计算 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资。假设他一个月的税前工资(扣除五险一金后、未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算: 输入格式 输入的第一行包含一个整数T,表示小明的税后所得。所有评测数据保证小明的税前工资为一个整百的数。 输出格式 输出一个整数S,表示小明的税前工资。 样例输入 9255 样例输出 10000 评测用例规模与约定 对于所有评测用例,1 ≤ T ≤ 100000。 |
问题链接:CCF201612-2 工资计算
问题分析
首先,提前计算好每个征税点之前最多有多少工资。如果税后收入比这个工资要低,那么他的工资肯定比这个征税点要小。
还有一个问题就是如果税后工资比最后的征税点工资还要大,那么他的原始工资肯定不超过税后工资的二倍
python中没有整型浮点型,所以在乘以税率的时候一定要向int转换
具体实现请参考下面代码
满分代码
#下面两个数组分别记录收税点和对应的超过这个点需要收多少税
mon=[3500,3500+1500,3500+4500,3500+9000,3500+35000,3500+55000,3500+80000]
tax=[0.03,0.1,0.2,0.25,0.3,0.35,0.45]
#下面这个数组记录着对应着每个收税点,最大工资能有多少,如果税后工资低于某个收税点最大工资。说明原工资肯定没有这个收税点高
#例如税后工资小于tax_range[3],那么就意味着其工资一定小于mon[3]
tax_range=[3500]
for i in range(1,len(tax)):
tax_range+=[int(tax_range[i-1]+(mon[i]-mon[i-1])*(1-tax[i-1]))]
#
#
t=int(input())
#找出小于或者等于最大工资的位置,如果position还是len(tax_range)+1,代表工资超过83500
position=len(tax_range)
for i in range(len(tax_range)):
if t<tax_range[i]:
position=i
break
#工资超过83500之后,税率为45%,因此最大工资也超不过税后工资二倍
if position!=0:
#只用从上一个收税点开始,循环到二倍的t即可,工资一定在这个区间里面
for money in range(mon[position-1],2*t,100):
if int((money-mon[position-1])*(1-tax[position-1])+tax_range[position-1])==t:
print(money)
break
#工资小于3500,不收税
else:
print(t)
#
#
#
#由于征税点很少,所以前8行的步骤其实可以提前通过计算器算好(但是我们要假设他很多)
#
#
#