问题描述
试题编号: | 201612-2 |
试题名称: | 工资计算 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资。假设他一个月的税前工资(扣除五险一金后、未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算: 输入格式 输入的第一行包含一个整数T,表示小明的税后所得。所有评测数据保证小明的税前工资为一个整百的数。 输出格式 输出一个整数S,表示小明的税前工资。 样例输入 9255 样例输出 10000 评测用例规模与约定 对于所有评测用例,1 ≤ T ≤ 100000。 |
解题思路:
这道题要求由税后工资求出税前工资,如果单纯的用列数学表达式的方法必定很复杂,而且较易出错。针对这种已给出大量计算常量的题目,我们可以考虑用查表法(所谓的“表”即为数据结构中的“查找表”)。
查找表带来的优势主要有:
(1)速度上的显著提升,因为从内存中提取数值经常要比复杂的计算速度快很多;
(2)其次,它也使一些复杂的问题有了较为清晰的逻辑呈现,比较常见的是(比如这题),把问题描述划分成了一个个区间,在不同的区间内判断该进行什么样的操作就会容易许多;
(3)还有就是,利用查表法写的程序,如果后期的相关规则发生了变动,代码的修改量也会较小,因为只需要调整表格数据,不用改变程序逻辑。
代码如下:
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int s,t;//税前工资,税后工资
int[] sRange={0,3500,3500+1500,3500+4500,3500+9000,3500+35000,
3500+55000,3500+80000};//理论税前工资区间
int[] tax={0,3,10,20,25,30,35,45};
t=sc.nextInt();
int[] tRange=new int[sRange.length];//理论税后工资区间
tRange[0]=sRange[0];
tRange[1]=sRange[1];//0~3500由于不涉及交税,所以税前和税后一样
for(int i=2;i<tRange.length;i++)
tRange[i]=tRange[i-1]+(sRange[i]-sRange[i-1])-
(sRange[i]-sRange[i-1])*tax[i-1]/100;
int i;
for(i=0;i<tRange.length;i++)
if(t<=tRange[i])
break;//得知 tRange[i-1]<t<=tRange[i]
if(i==1)//0<t<=3500
s=t;
else
s=sRange[i-1]+(t-tRange[i-1])/(100-tax[i-1])*100;
System.out.println(s);
}
}