输入格式:
输入在一行中按照 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
模拟题,模拟分数加减乘除的过程,整体不难,但是要比较细心,要注意约分,转换成带分数,分子为0等各种情况
虽然题目说给出的数字都在整型范围内,但是运算的时候回超过整型的范围,所以要用long
博主用一个类f,来储存分数的分子分母,在类里写分数的四则运算
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String fa = sc.next();
String fb = sc.next();
f a = getf(fa);
f b = getf(fb);
System.out.println(opf(a) + " + " + opf(b) + " = " + opf(a.add(b)));
System.out.println(opf(a) + " - " + opf(b) + " = " + opf(a.min(b)));
System.out.println(opf(a) + " * " + opf(b) + " = " + opf(a.mul(b)));
f d = a.div(b);
System.out.println(opf(a) + " / " + opf(b) + " = " + (d == null ? "Inf" : opf(d)));
}
static String opf(f a) {
//输出分数a的方法
long fz = a.fz, fm = a.fm;//获取a的分子和分母
long z = fz / fm;//获取证书部分
long m = Math.abs(fz) % fm;//转换成带分数后的分子
String r = "";//输出结果
if (m == 0) {
//转换成带分数后分子为0,即分子是分母的倍数
//直接输出证书部分
r = z + "";
} else {
//转换成带分数后分子不为0
if (z == 0) {
//整数部分为0
//判断分子是否小于0,小于0要在前面加负号
r = (fz < 0 ? -m : m) + "/" + fm;
} else {
//整数部分不为0,转换成带分数后分子也不为0
r = z + " " + m + "/" + fm;
}
}
if (z < 0 || (z == 0 && fz < 0)) {
//如果该分数是负数,则要在该分数两旁加括号
r = "(" + r + ")";
}
return r;
}
static f getf(String t) {
String[] ab = t.split("/");
long a = Long.parseLong(ab[0]);
long b = Long.parseLong(ab[1]);
return new f(a, b);
}
static class f {
long fz;
long fm;
f() {
}
f(long ia, long ib) {
//初始化的时候直接约分
long g = gcd(Math.abs(ia), ib);
fz = ia / g;
fm = ib / g;
}
f add(f b) {
//分数加法
long fm = this.fm * b.fm;
long fz = this.fz * b.fm + b.fz * this.fm;
return new f(fz, fm);
}
f min(f b) {
//分数减法
long fm = this.fm * b.fm;
long fz = this.fz * b.fm - b.fz * this.fm;
return new f(fz, fm);
}
f mul(f b) {
//分数乘法
long fz = this.fz * b.fz;
long fm = this.fm * b.fm;
return new f(fz, fm);
}
f div(f b) {
//分数除法
if (b.fz == 0) {
//除以0的情况,返回null
return null;
}
//乘以b的倒数
long fz = this.fz * b.fm;
long fm = this.fm * b.fz;
//相乘后可能分子和分母可能都有可能出现负数,所以要进行判断
if ((fz < 0 && fm > 0) || (fm < 0 && fz > 0)) {
//分子和分母只有一个是负数
fz = -Math.abs(fz);
fm = Math.abs(fm);
} else {
//分子分母都是负数或都是正数
fz = Math.abs(fz);
fm = Math.abs(fm);
}
return new f(fz, fm);
}
}
static long gcd(long a, long b) {
//求最大公约数
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
}
本文详细解析了PAT乙级1034有理数四则运算题目,通过自定义分数类实现加、减、乘、除运算,并将结果转换为最简形式。文章提供了完整的Java代码示例,包括输入处理、运算逻辑及输出格式化。
3049

被折叠的 条评论
为什么被折叠?



