PAT(B) 1034 有理数四则运算(Java)

108 篇文章 0 订阅
68 篇文章 3 订阅

题目链接:1034 有理数四则运算 (20 point(s))

题目描述

本题要求编写程序,计算 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

3)输入:

4/5 -12/15

3)输出:

4/5 + (-4/5) = 0
4/5 - (-4/5) = 1 3/5
4/5 * (-4/5) = (-16/25)
4/5 / (-4/5) = (-1)

4)输入:

2147483647/2 2/1

4)输出:

1073741823 1/2 + 2 = 1073741825 1/2
1073741823 1/2 - 2 = 1073741821 1/2
1073741823 1/2 * 2 = 2147483647
1073741823 1/2 / 2 = 536870911 3/4

分析?

题目也玩文字游戏了。。。PAT的第3组,第4组数据是大数。(计算过程中会超int,但是结果能约分使得结果在int范围内)

代码?

/*********************************************************************************
Submit Time			Status		Score	Problem	Compiler		Run Time	User
7/17/2019, 23:27:10	Accepted	20		1034	Java (openjdk)	91 ms		wowpH
*********************************************************************************/
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		// "\\s|/"是正则表达式,split()用空格和斜杠分割字符串
		String[] s = sc.nextLine().split("\\s|/");	// 得到分子,分母,分子,分母
		sc.close();
		Number one = new Number(Integer.parseInt(s[0]), Integer.parseInt(s[1]));
		Number two = new Number(Integer.parseInt(s[2]), Integer.parseInt(s[3]));
		char[] op = { '+', '-', '*', '/' };			// 运算符
		for (int i = 0; i < 4; ++i) {
			one.output();
			System.out.print(" " + op[i] + " ");
			two.output();
			System.out.print(" = ");
			one.operate(two, op[i]).output();		// 运算并输出结果
			System.out.println();
		}
	}
}

class Number {										// 操作数
	long fz, fm;									// 分子,分母

	public Number(long fz, long fm) {
		this.fz = fz;
		this.fm = fm;
		if (0 != fz && 0 != fm) {					// 若分子,分母都不为0,则约分
			long gcd = gcd(Math.abs(fz), fm);		// 最大公约数
			this.fz /= gcd;
			this.fm /= gcd;
		}
	}

	public Number operate(Number num, char ch) {	// 四则运算运算,返回结果
		if ('+' == ch) {							// 加法
			return new Number(fz * num.fm + num.fz * fm, fm * num.fm);
		} else if ('-' == ch) {						// 减法
			return new Number(fz * num.fm - num.fz * fm, fm * num.fm);
		} else if ('*' == ch) {						// 乘法
			return new Number(fz * num.fz, fm * num.fm);
		} else {									// 除法,'/' == ch
			return divide(num);
		}
	}

	private Number divide(Number num) {				// 除法运算,返回结果
		if (0 == num.fz) {							// 除数为0
			return new Number(1, 0);				// 返回分母为0的Number对象
		} else if (num.fz < 0) {					// 除数是负数
			return new Number(-fz * num.fm, -fm * num.fz);// 将负号移到分子,返回结果
		}
		return new Number(fz * num.fm, fm * num.fz);// 返回结果
	}

	public void output() {							// 输出操作数
		if (0 == fm) {								// 分母为0
			System.out.print("Inf");
		} else if (0 == fz) {						// 分子为0
			System.out.print(0);
		} else {
			if (fz < 0) {							// 负数
				System.out.print("(");				// 输出括号
			}
			long a = Math.abs(fz);					// 分子的绝对值
			if (0 == a % fm) {						// 整数
				System.out.print(fz / fm);
			} else if (a > fm) {					// 带分数
				System.out.print((fz / fm) + " " + (a % fm) + "/" + fm);
			} else {								// 真分数
				System.out.print(fz + "/" + fm);
			}
			if (fz < 0) {							// 负数
				System.out.print(")");				// 输出括号
			}
		}
	}

	private static long gcd(long a, long b) {		// 求最大公约数,a和b均为正数
		while (0 != a % b) {						// a不是b的倍数
			long temp = a;
			a = b;
			b = temp % b;							// 余数赋值给b
		}
		return b;									// 返回最大公约数
	}
}

版权声明

  1. 转载、参考、引用必须在首页添加如下文字:
    [PAT(B) 1034 有理数四则运算(Java)—wowpH](https://blog.csdn.net/pfdvnah/article/details/96381865)
  2. 代码原创,公开引用不能删除首行注释(作者,版本号,时间等信息);
  3. 如果有疑问欢迎评论区留言,尽量解答;
  4. 如果有错误,还望大侠评论区指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值