题目:有理数四则运算 (20 分)

本题要求编写程序,计算 2 个有理数的和、差、积、商。

输入格式:
输入在一行中按照 a1/b1 a2/b2的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0。

输出格式:
分别在 4 行中按照 有理数1 运算符 有理数2 = 结果 的格式顺序输出 2 个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式k a/b,其中 k 是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为 0,则输出 Inf。题目保证正确的输出中没有超过整型范围的整数。

输入样例 1:
2/3 -4/2
输出样例 1:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
输入样例 2:
5/3 0/6
输出样例 2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

题目分析

首先这个题目是模拟四则运算,有很多的小细节需要考虑,首先是给出的分数需要显示正负,正负显示不同,显示整数和分数部分。
这个题目需要对分数的四则运算很清楚,同时,由于是分数的操作,则除法的运算是本题的核心。做了好久,想不出完美的解决办法,借鉴了网上的代码,并给出了完整的注释。

import java.util.Scanner;public class Y1034 {public static void main(String[] args) {Scanner in = new Scanner(System.in);String[] input = in.nextLine().split("[\\s/]");in.close();//分离出数据long a1 = Integer.parseInt(input[0]);long b1 = Integer.parseInt(input[1]);long a2 = Integer.parseInt(input[2]);long b2 = Integer.parseInt(input[3]);//分母不为零,题目说了不能为零,在我看来可以不用写这个判断,可以删去此处if语句if (b1 != 0 && b2 != 0) {add(a1, b1, a2, b2);minus(a1, b1, a2, b2);mutilply(a1, b1, a2, b2);divide(a1, b1, a2, b2);}}//判断分子分母计算后的大小和正负,也可以当做是除法操作public static void tackle(long a, long b) {if (a == 0) {//若分子为零,直接输出0System.out.print(0);return;}//若分子小于零,则数值小于零,打印左括号和-号boolean isMinus = a > 0 ? false : true;if (isMinus) {System.out.print("(-");a = -a;//改值}long gcd = getGcd(a, b);//最大公约数a = a / gcd;//约分操作b = b / gcd;if (a % b == 0) {System.out.print(a / b);//无余数,输出整数} else if (Math.abs(a) > b) {//a的绝对值大,则一定存在整数部System.out.print(a / b + " " + a % b + "/" + b);//原代码是(a % b) % b,对b取余一定小于b,多做一次取余操作还是原数,删去} /*//这一步与第一个重了,可以省去else if (a == b) {System.out.print(1);}*/ else {System.out.print(a + "/" + b);}if (isMinus) {//若打印了左括号,输出右括号System.out.print(")");}}//除法public static void divide(long a1, long b1, long a2, long b2) {tackle(a1, b1);//计算第一个数并输出System.out.print(" / ");tackle(a2, b2);//计算第二个数并输出System.out.print(" = ");if (a2 == 0) {System.out.print("Inf");} else if (a2 < 0) {//a/b 除 c/d = ad/bctackle(-1 * a1 * b2, -1 * a2 * b1);} else {tackle(a1 * b2, a2 * b1);}}//乘法public static void mutilply(long a1, long b1, long a2, long b2) {tackle(a1, b1);System.out.print(" * ");tackle(a2, b2);System.out.print(" = ");//a/b 乘 c/d = ac/bdtackle(a1 * a2, b1 * b2);System.out.println();}//减法public static void minus(long a1, long b1, long a2, long b2) {tackle(a1, b1);System.out.print(" - ");tackle(a2, b2);System.out.print(" = ");//减法,a/b 减 c/d 通分做计算,分子为ad-bc,分母为bdtackle(a1 * b2 - a2 * b1, b1 * b2);System.out.println();}//加法public static void add(long a1, long b1, long a2, long b2) {tackle(a1, b1);System.out.print(" + ");tackle(a2, b2);System.out.print(" = ");//加法,a/b 加 c/d 通分做计算,分子为ad+bc,分母为bdtackle(a1 * b2 + a2 * b1, b1 * b2);System.out.println();}//迭代法(递推法):欧几里得算法:计算分子分母的最大公约数public static long getGcd(long a, long b) {while (a % b != 0) {long temp = a % b;a = b;b = temp;}return b;}
}

PAT乙级——1034(模拟四则运算)相关推荐

  1. Pat乙级 1034 有理数四则运算

    Pat乙级 1034 有理数四则运算 思路 代码 题目网址 https://pintia.cn/problem-sets/994805260223102976/problems/99480528762 ...

  2. PAT乙级(1034 有理数四则运算)

    PAT乙级 1034 有理数四则运算 题目描述 解题代码 PAT解题所有题目 可看该模块下其他文章 代码涉及c++和c  供大家一起参考学习! 输入格式: 输入在一行中按照 a1/b1 a2/b2 的 ...

  3. PAT 乙级 1034. 有理数四则运算(20) Java版

    本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只 ...

  4. PAT乙级1034题解

    题目详情: 1034 有理数四则运算 (20 分) 本题要求编写程序,计算 2 个有理数的和.差.积.商. 输入格式: 输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分 ...

  5. C++学习之路 | PTA乙级—— 1034 有理数四则运算 (20 分)(精简)

    1034 有理数四则运算 (20 分) 本题要求编写程序,计算 2 个有理数的和.差.积.商. 输入格式: 输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是 ...

  6. PAT乙级题目索引(题目+解析+AC代码)

    题目信息 分值 PAT 乙级 1001 害死人不偿命的(3n+1)猜想 15 PAT 乙级 1002 写出这个数 20 PAT 乙级 1003 我要通过! 20 PAT 乙级 1004 成绩排名 20 ...

  7. 【2020模拟考试T4】【PAT乙】1034 有理数四则运算 (20分) 测试点2

    problem 1034 有理数四则运算 (20分) 本题要求编写程序,计算 2 个有理数的和.差.积.商. 输入格式: 输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中 ...

  8. PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)

    PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)  http://www.patest.cn/contests/pat-b-practise/1034 ...

  9. PAT乙级题库踩坑实录

    PAT乙级题库踩坑实录 [截止2021.7.28乙级题库已经全部AC] 题目名称: 1030 完美数列 (25 分) 测试点3踩坑 每次取m后,不用从m后第一个元素开始判断是否大于mp,直接从m后第m ...

  10. PAT乙级题目对应知识点分类梳理例程(更新至1102)

    PAT乙级题目对应知识点分类梳理 PAT乙级的90道题的知识点与对应的题号整理如下,便于做专项练习和巩固! 题型 备注 1.字符串函数 考察字符串相关知识,如逆转.字母与数字的判断与转化.字符串拼接. ...

最新文章

  1. 通过属性值从对象数组中获取JavaScript对象[重复]
  2. Eclipse单元测试Android编程,在Eclipse中进行Android单元测试-Fun言
  3. 我国农村经济发展战略
  4. 快速穷举TCP连接欺骗攻击-利用SYN Cookies
  5. 强基计划对计算机,你对报考强基计划怎么看?
  6. 转发文章最多的朋友可以免费进入价值99元的《湾区AI精英会》海归圈子
  7. 性能测试工具AlldayTest 的测试方法及说明
  8. Window 通过cmd查看端口占用、相应进程、杀死进程等的命令
  9. keystroke java_Java KeyStroke.getCharacter方法代码示例
  10. [面试] C/C++ 语法(六)—— RTTI(运行时类型信息)
  11. 容器技术Docker K8s 26 容器服务ACK基础与进阶-监控管理
  12. 破解金山ocr文字识别软件
  13. 关于冒泡、快排、二分排序算法分析
  14. java实现ftp文件夹增量上传下载
  15. 德国自动驾驶与电动出行趋势进展
  16. STM32系列BSP外设驱动使用教程
  17. 为村上隆直播做同传的火山翻译:成立仅3年,拿下5项世界冠军
  18. 计算机系统基础书记,【盘点】开学第一周:学风浓 教风严 校风正
  19. UE4 C++ UMG框架搭建
  20. 读懂python代码_【坚持】Selenium+Python学习之从读懂代码开始 DAY6

热门文章

  1. QT 删除QString空白字符
  2. 最优服务次序问题 水 NOJ1254
  3. 京东 Android 客户端样式的级联地址选择器
  4. 台式计算机红外线端口,台式电脑的红外线端口在哪?
  5. steam在连接至steam服务器时发生错误解决办法
  6. BUUCTF WEB PIAPIAPIA1
  7. Kafka之sync、async以及oneway
  8. AIDL简单实用新手教程(AIDL 包含回调,耗时处理,in out inout oneway使用、打包jar等内容) 附demo下载
  9. 09 conventional exercise
  10. 文件不能粘贴ftp服务器中,ftp服务器复制粘贴文件夹