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 实现相关推荐

  1. CCF 201612-2 工资计算 java 解题

    问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算: 1) 个人所得 ...

  2. 【CCF认证 201612-2 】工资计算

    问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算: 1) 个人所得 ...

  3. java题算工资,AcWing 3238. 工资计算java

    编程写不了,只能直接手算出来了..... 数据说明:若超过起征点最多达到1500,最多需要交45的税 若超过起征点最多达到4500,最多需要交345的税 import java.util.Scanne ...

  4. 【CSP】【Java】工资计算

    问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算: 1) 个人所得 ...

  5. CCF CSP 行车路线 java 201712_4

    CCF CSP 行车路线 java 201712_4 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好 ...

  6. java :工资计算

    *工资计算 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算: 1) 个人所 ...

  7. python计算每月工资多少钱_[Python]CCF——工资计算(201612-2)

    工资计算 一.问题描述 问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交的个人所得税按如下公 ...

  8. ##(C语言) CSP 201612-2 工资计算(打表法)(100分)

    试题编号: 201612-2 试题名称: 工资计算 时间限制: 1.0s 内存限制: 256.0MB 问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的 ...

  9. CCF计算机软件能力认证试题练习:201612-2 工资计算

    工资计算 来源: 标签: 参考资料: 相似题目: 题目 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应 ...

最新文章

  1. 怎样用批处理来执行多个exe文件
  2. 职场社交是一个真需求吗?
  3. symbian 视频播放解决方案
  4. mysql的natural join_MySQL基础之Natural Join用法
  5. java canvas画图,UWP Canvas绘图越界
  6. jboss-AS目录结构了解(资料摘取)
  7. 使用fetch封装ajax_如何使用Fetch在JavaScript中进行AJAX调用
  8. Oracle public view,【易错概念】以太坊Solidity函数的external/internal,public/private,view/pure/payable区别...
  9. android.intent.action.view 融云,Android 融云SDK集成单聊
  10. 解析函數論 Page 28 連續復變函數的最簡單的性質
  11. centos下查看最大Socket连接数
  12. 小班语言教案《水果屋》
  13. Origin2017软件安装教程
  14. 属于计算机审计中测试信息系统的方法是,审计信息化问题浅析论文
  15. 计算机系统结构cache,大连理工大学计算机系统结构实验 实验四
  16. QT 基于Libvlc的视频播放器
  17. 轻量级Kubernetes之k3s:10:ContainerCreating状态的解决方法
  18. NBIoT接收十六进制数据格式转化
  19. C#组件系列——NPOI使用手册
  20. Auto CAD:图纸幅面规格之图纸幅面、标题栏与会签栏、图签与布局空间之详细攻略

热门文章

  1. IT定律之计算机行业发展规律
  2. C++设计模式学习资料
  3. redis 删除所有key
  4. 注册电气工程师短路电流计算口诀法
  5. WebService介绍及演示:(手机号归属地查询+QQ号是否在线查询)
  6. java 技术支持_JAVA技术支持课--第一次java语言技术支持授课思路
  7. servlet获取表单数据
  8. 实习程序员帮上级“背锅”成习惯,转正后还来?实习生没人权啊!
  9. ffmpeg分割视频
  10. JDBC连接Mysql(附完整代码)