CCF-CSP -201612-2 工资计算 java 实现
CCFCSP的1-2题很简单。但是这里又在很简单的问题上翻船了。这里记录一下吧!
试题
试题编号: 201612-2
试题名称: 工资计算
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资。
税后工资T = 税前工资S元 - 个人所得税f(S);
S = f(S) + T;
所有评测数据保证小明的税前工资为一个整百的数。
假设他一个月的税前工资(扣除五险一金后、未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算:
1) 个人所得税起征点为3500元,若S不超过3500,则不交税,3500元以上的部分才计算个人所得税,令A=S-3500元;
2) A中不超过1500元的部分,税率3%;
3) A中超过1500元未超过4500元的部分,税率10%;
4) A中超过4500元未超过9000元的部分,税率20%;
5) A中超过9000元未超过35000元的部分,税率25%;
6) A中超过35000元未超过55000元的部分,税率30%;
7) A中超过55000元未超过80000元的部分,税率35%;
8) A中超过80000元的部分,税率45%;
例如,如果小明的税前工资为10000元,则A=10000-3500=6500元,其中不超过1500元部分应缴税1500×3%=45元,超过1500元不超过4500元部分应缴税(4500-1500)×10%=300元,超过4500元部分应缴税(6500-4500)×20%=400元。总共缴税745元,税后所得为9255元。
已知小明这个月税后所得为T元,请问他的税前工资S是多少元。
输入格式
输入的第一行包含一个整数T,表示小明的税后所得。所有评测数据保证小明的税前工资为一个整百的数。
输出格式
输出一个整数S,表示小明的税前工资。
样例输入
9255
样例输出
10000
评测用例规模与约定
对于所有评测用例,1 ≤ T ≤ 100000。
这个问题并不复杂。简单分析一下:
工资的计算公式如下:
T = S - tax
其中,T为税后工资,S为税前工资,tax为需缴纳的税款,并且tax与S存在函数关系:
tax = f(S)
这个函数就是一个简单的分段函数:几个节点如下表:
S | tax | T |
---|---|---|
1000 | 0 | 1000 |
3500 | 0 | 3500 |
3500+1500=5000 | 1500*3% = 45 | 4955 |
5000+3000=8000 | 45+3000*10%=345 | 7655 |
8000+4500=12500 | 345+4500*20%=1245 | 11255 |
12500+26000=38500 | 1245+26000*25%=7745 | 30755 |
38500+20000=58500 | 7745+20000*30%=13745 | 44755 |
58500+25000=83500 | 13745+25000*35%=22495 | 61005 |
90000 | 22495+(90000-83500)*45%=25420 | 64580 |
另外需要注意的是,题目中对S的限定
所有评测数据保证小明的税前工资为一个整百的数。
这是一个比较有用的信息,大大简化了程序。
分析到这,就可以写代码了。
首先是我第一版的(出错的)代码:
import java.util.*;
public class Main{public static void main(String args[]){Scanner cin = new Scanner(System.in);int T = cin.nextInt();//税后工资double S = 0;//税前工资if(T <= 3500)S = T;else if(T <=4955){S = (T-105)/0.97;}else if(T <=7655){S = (T-455)/0.9;}else if(T <=11255){S = (T-1255)/0.8;}else if(T <=30755){S = (T-1880)/0.75;}else if(T <=44755){S = (T-3805)/0.7;}else if(T <=61005){S = (T-6730)/0.65;}else{S = (T-15080)/0.55;}System.out.println((int)S);}
}
这段代码提交以后,就会报说是错误,给了80分。我之前找了很久,也没发现是哪错了。这几天重新看了一下,才发现了问题。我写了一个Check程序,
for(int i = 1; i < 1001; i++){S = i * 100;//税前工资都是整百的!T = calT(S);//由税前工资计算税后工资s = calS(T);//反推税前工资,看看是否一致;if (s != S) //如果不一致,报出来!System.out.println("when S = " + S + ",T = " + T + ", s=" +s);}
运行结果如下:(截取了部分)
简单来说,就是:
55 /0.55 并没有输出100。0,而是输出了99.99999999999
这样后面强制转换,向下取整,自然就是小1了!
网上搜了一下,
http://bbs.csdn.net/topics/390152581
也遇到了这个问题。
其主要原因是浮点数值采用二进制系统表示, 而在二进制系统中无法精确的表示分数 1/10。 这就好像十进制无法精确地表示 1/3 一样。 如果需要在数值计算中不含有任何舍入误差, 就应该使用BigDecimal 类。——《Java核心技术 卷1》
由上原因,表现出来的就是浮点数的计算结果围绕理论值上下波动。
程序中的错误,就是因为当计算值偏大时,取整后,结果正是我们想要的,没有问题;可是当结果偏小时,取整后,就会比理论值小1。因此加上加上下面这一行,避免浮点数除法造成的影响。结果就对了!
因此以后遇到浮点值运算的时候,一定要记得处理这个。
回到工资计算这个问题中,对计算结果,加了下面呢一行代码:
int ss = ((int)S +1) / 100 * 100;
这样就没问题了。
CCF-CSP -201612-2 工资计算 java 实现相关推荐
- CCF 201612-2 工资计算 java 解题
问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算: 1) 个人所得 ...
- 【CCF认证 201612-2 】工资计算
问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算: 1) 个人所得 ...
- java题算工资,AcWing 3238. 工资计算java
编程写不了,只能直接手算出来了..... 数据说明:若超过起征点最多达到1500,最多需要交45的税 若超过起征点最多达到4500,最多需要交345的税 import java.util.Scanne ...
- 【CSP】【Java】工资计算
问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算: 1) 个人所得 ...
- CCF CSP 行车路线 java 201712_4
CCF CSP 行车路线 java 201712_4 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好 ...
- java :工资计算
*工资计算 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算: 1) 个人所 ...
- python计算每月工资多少钱_[Python]CCF——工资计算(201612-2)
工资计算 一.问题描述 问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交的个人所得税按如下公 ...
- ##(C语言) CSP 201612-2 工资计算(打表法)(100分)
试题编号: 201612-2 试题名称: 工资计算 时间限制: 1.0s 内存限制: 256.0MB 问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的 ...
- CCF计算机软件能力认证试题练习:201612-2 工资计算
工资计算 来源: 标签: 参考资料: 相似题目: 题目 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应 ...
最新文章
- 怎样用批处理来执行多个exe文件
- 职场社交是一个真需求吗?
- symbian 视频播放解决方案
- mysql的natural join_MySQL基础之Natural Join用法
- java canvas画图,UWP Canvas绘图越界
- jboss-AS目录结构了解(资料摘取)
- 使用fetch封装ajax_如何使用Fetch在JavaScript中进行AJAX调用
- Oracle public view,【易错概念】以太坊Solidity函数的external/internal,public/private,view/pure/payable区别...
- android.intent.action.view 融云,Android 融云SDK集成单聊
- 解析函數論 Page 28 連續復變函數的最簡單的性質
- centos下查看最大Socket连接数
- 小班语言教案《水果屋》
- Origin2017软件安装教程
- 属于计算机审计中测试信息系统的方法是,审计信息化问题浅析论文
- 计算机系统结构cache,大连理工大学计算机系统结构实验 实验四
- QT 基于Libvlc的视频播放器
- 轻量级Kubernetes之k3s:10:ContainerCreating状态的解决方法
- NBIoT接收十六进制数据格式转化
- C#组件系列——NPOI使用手册
- Auto CAD:图纸幅面规格之图纸幅面、标题栏与会签栏、图签与布局空间之详细攻略