/*** Created by feichen on 2018/6/11.* <p>* <p>* 给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果。 这个结果应该是不可约分的分数,即最简分数。* 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1。所以在上述例子中, 2 应该被转换为 2/1。* <p>* 示例 1:* <p>* 输入:"-1/2+1/2"* 输出: "0/1"* 示例 2:* <p>* 输入:"-1/2+1/2+1/3"* 输出: "1/3"* 示例 3:* <p>* 输入:"1/3-1/2"* 输出: "-1/6"* 示例 4:* <p>* 输入:"5/3+1/3"* 输出: "2/1"* 说明:* <p>* 输入和输出字符串只包含 '0' 到 '9' 的数字,以及 '/', '+' 和 '-'。* 输入和输出分数格式均为 ±分子/分母。如果输入的第一个分数或者输出的分数是正数,则 '+' 会被省略掉。* 输入只包含合法的最简分数,每个分数的分子与分母的范围是  [1,10]。 如果分母是1,意味着这个分数实际上是一个整数。* 输入的分数个数范围是 [1,10]。* 最终结果的分子与分母保证是 32 位整数范围内的有效整数。*/
public class FractionAddition {static class Fraction {//符号TAG tag = TAG.POSITIVE;//分子int numerator;//分母int denominator;@Overridepublic String toString() {return (tag == TAG.NEGATIVE ? "-" : "") + numerator + "/" + denominator;}}enum TAG {NEGATIVE,POSITIVE}public String fractionAddition(String expression) {List<Fraction> fractions = convert(expression);if (!fractions.isEmpty()) {fractions = calculate(fractions);}return !fractions.isEmpty() ? reduceFraction(fractions.get(0)).toString() : "";}/*** 计算** @param fractions* @return*/public static List<Fraction> calculate(List<Fraction> fractions) {if (fractions.isEmpty() || fractions.size() == 1) {return fractions;}Fraction last = fractions.get(fractions.size() - 1);Fraction last2 = fractions.get(fractions.size() - 2);int denominatorLcm = lcm(last.denominator, last2.denominator);int lastNumerator = last.numerator * (denominatorLcm / last.denominator);int last2Numerator = last2.numerator * (denominatorLcm / last2.denominator);if (last.tag == TAG.NEGATIVE) {lastNumerator = -lastNumerator;}if (last2.tag == TAG.NEGATIVE) {last2Numerator = -last2Numerator;}int numeratorResult = lastNumerator + last2Numerator;Fraction newFraction = new Fraction();newFraction.numerator = Math.abs(numeratorResult);newFraction.denominator = denominatorLcm;newFraction.tag = numeratorResult < 0 ? TAG.NEGATIVE : TAG.POSITIVE;fractions.remove(fractions.size() - 1);fractions.remove(fractions.size() - 1);fractions.add(newFraction);return calculate(fractions);}/*** 约分** @param fraction* @return*/public static Fraction reduceFraction(Fraction fraction) {if (fraction.numerator == 0) {fraction.denominator = 1;return fraction;}int gcd = gcd(fraction.numerator, fraction.denominator);if (gcd != 1) {fraction.numerator = fraction.numerator / gcd;fraction.denominator = fraction.denominator / gcd;}return fraction;}/*** 最大公约数** @param a* @param b* @return*///a b 为正整数public static int gcd(int a, int b) {if (a == b) {return a;}if (a < b) {return gcd(b, a);} else {if (((a & 1) == 0) && ((b & 1) == 0)) { //ab都为偶数return gcd(a >> 1, b >> 1) << 1;} else if (((a & 1) == 0) && ((b & 1) == 1)) { //a为偶数,b为奇数return gcd(a >> 1, b);} else if (((a & 1) == 1) && ((b & 1) == 0)) { //a为奇数,b为偶数return gcd(a, b >> 1);} else { //ab都为奇数return gcd(b, a - b);}}}/*** 最小公倍数** @param a* @param b* @return*/public static int lcm(int a, int b) {return a * b / gcd(a, b);}/*** 转换** @param expression* @return*/public static List<Fraction> convert(String expression) {List<Fraction> fractions = new ArrayList<>();char[] chars = expression.toCharArray();for (int i = 0; i < chars.length; i++) {if (chars[i] == '/') {Fraction fraction = new Fraction();List<Character> numeratorCharList = new ArrayList<>();//分子处理for (int j = i - 1; j >= 0; j--) {if (Character.isDigit(chars[j])) {numeratorCharList.add(0, chars[j]);} else {if (chars[j] == '-') {fraction.tag = TAG.NEGATIVE;}break;}}List<Character> denominatorCharList = new ArrayList<>();for (int j = i + 1; j < chars.length; j++) {if (Character.isDigit(chars[j])) {denominatorCharList.add(chars[j]);} else {break;}}String numeratorStr =numeratorCharList.stream().map(e -> e.toString()).reduce((acc, e) -> acc + e).get();String denominatorStr =denominatorCharList.stream().map(e -> e.toString()).reduce((acc, e) -> acc + e).get();fraction.numerator = Integer.valueOf(numeratorStr);fraction.denominator = Integer.valueOf(denominatorStr);fractions.add(fraction);}}return fractions;}public static void main(String[] args) {FractionAddition fractionAddition = new FractionAddition();System.out.println(fractionAddition.fractionAddition("-5/2+10/3+7/9"));}} 

转载于:https://www.cnblogs.com/feichen-2018/p/9187554.html

leetcode-分数加减法相关推荐

  1. # 异运算_小学数学整数、小数、分数加减法运算法则及练习(可打印)

    很多孩子的数学不好,尤其是女孩子.家长往往认定为数学不好就是孩子不擅长,能力差. 其实未必,有的孩子数学不好的原因并不在于智商,而是没有理解到数学的方法与逻辑.比如小学的运算中,很多孩子并没有了解到运 ...

  2. nyoj_111_分数加减法_201311281341

    分数加减法 时间限制:3000 ms  |           内存限制:65535 KB 难度:2 描述 编写一个C程序,实现两个分数的加减法 输入 输入包含多行数据 每行数据是一个字符串,格式是& ...

  3. poj 3979 分数加减法

    分数加减法 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8801   Accepted: 2798 Description ...

  4. POJ3979 分数加减法【水题】

    分数加减法 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18176 Accepted: 5643 Description 编写 ...

  5. 五年级上册分数计算机,分数计算题 五年级上册分数加减法计算题(100道)

    题目: 五年级上册分数加减法计算题(100道)有口算,也要有脱式计算 解答: (1)6/14+7/14= (2)2/13+5/13= (3)6/15+9/15= (4)6/14+1/14=(5)4/1 ...

  6. java编写分数加减法_JAVA 分数加减法

    分数加减法 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 编写一个C程序,实现两个分 ...

  7. 分数加减法 java,Java——分数加减法

    分数加减法 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 编写一个C程序,实现两个分数的加减法 Input 输入包含多 ...

  8. 分数加减法 java,Java练习 SDUT-2253_分数加减法

    ###分数加减法 Time Limit: 1000 ms Memory Limit: 65536 KiB ####Problem Description 编写一个C程序,实现两个分数的加减法 #### ...

  9. nyoj 分数加减法

    分数加减法 难度: 2 描述 编写一个C程序,实现两个分数的加减法 输入 输入包含多行数据 每行数据是一个字符串,格式是"a/boc/d". 其中a, b, c, d是一个0-9的 ...

  10. 科学计算机怎么算分数加减,《如何提高五年级学生异分母分数加减法计算正确率》...

    数学五年级教材中的异分母分数加减法计算,难度增加了.不少学生出现了计算能力差,计算速度慢,计算错误率偏高的问题.引导学生动手操作.自主探索,不仅是转变学生数学学习方式的需要,也是学生发现算理,理解算理 ...

最新文章

  1. 联想小新air13pro重装系统_联想 小新Air 13 ProU盘装系统win7教程
  2. Linux字符设备驱动结构
  3. 对软连接进行cp,rm
  4. JAVA调用易信接口向指定好友推送消息(一)背景需求
  5. Java冒泡实现类Collections.sort()
  6. 三菱四节传送带控制梯形图_【毕业设计】三菱plc(论文)基于PLC的传送带的控制系统设计毕业设计...
  7. 还有不会用 SQL 的程序员吗?
  8. 关于Go1.14,你一定想知道的性能提升与新特性
  9. 【阿里云生活物联网架构师专题 ④】如何在天猫精灵IOT开放平台二次开发智能设备的 H5控制面板;
  10. Latex设置中文标题样式
  11. java孢子进化_孢子的进化起源
  12. Vue组件中关于@click.native.prevent事件
  13. 汽车外饰胶市场现状及未来发展趋势
  14. Python爬取古诗词
  15. ROS(ERROR):Rosdep cannot find all required resources to answer your query
  16. Java SE8 流 最全总结
  17. 一文读懂裸金属服务器是什么意思,和物理机有啥区别
  18. 波士顿大学 计算机专业,波士顿大学计算机专业怎么样?7大课程任你选
  19. 4种搜集来的Axure原型上传+在线预览的方法
  20. 案例 | 如何搭建高阶自动驾驶数据采集平台

热门文章

  1. 什么是Wildfly?
  2. wildfly(JBOSS)启动报错
  3. CSS进阶(7)- 样式补充
  4. 51nod 基础题题解(全)
  5. idea中使用git和svn
  6. 基于SSM考试在线报名管理系统
  7. python——pygame制作恶搞舍友小游戏
  8. UVa679 Dropping Balls (满二叉树+开关灯思想)
  9. SQL Server profile使用技巧
  10. SQL Server 使用全文索引进行页面搜索