东莞网站建设设计,专业制作外贸网站的公司,网站建设的税率,成都旅游必去的地方#x1f4d1;打牌 #xff1a; da pai ge的个人主页 #x1f324;️个人专栏 #xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出#xff0c;梅花香自苦寒来 ☁️有理数运算 实现对两个有理数的… 打牌 da pai ge的个人主页 ️个人专栏 da pai ge的博客专栏 ☁️宝剑锋从磨砺出梅花香自苦寒来 ☁️有理数运算 实现对两个有理数的基本运算包括加、减、乘、除。 输入描述 每个输入文件只包含一个测试用例测试用例会给出一行数据格式为 “a1/b1 a2/b2” 分子分母的范围都在长整型的范围内如果数字为负则符号只会出现在分子的前面。分母一定是非零数。 输出描述 针对每个测试用例都输出四行分别是这两个有理数的和、差、积和商格式为 “ 数 1 操作符 数 2 结果 ” 。注 意所有的有理数都将遵循一个简单形式 “k a/b” 其中 k 是整数部分 a/b 是最简分数形式如果该数为负数则必 须用括号包起来。如果除法中的除数为 0 则输出 “Inf” 。结果中所有的整数都在 long int 的范围内。 ☁️【题目解析】 本题看上去不难但是存在几个问题 1 、除数为 0 这个很好解决做个判断即可。 2 、负数的输出这个只要一个标签即可。 3 、题目中虽然没有明说但是这个数字处理后其实是有可能不存在分数部分或者整数部分的。也就是说将数据处 理完形成 k a/b 的格式后有可能只有一个 k 也可能只有一个 a/b 也有可能两者皆有所以要分别考虑这几种情 况。 ☁️【解题思路】 可以尝试实现一个有理数类将数据处理后重载一下加减乘除即可。处理数据的方法就是除一下 mod 一下的问题 加减乘除遵循基本的分数加减乘除原则最后求一下最大公约数做一下约分再处理一下数据就 OK 了。 ☁️【示例代码】 import java.util.*;
// s and the denominators
class Rational{
private long numerator; // 分子
private long denominator; // 分母
private long integer; // 整数部分
private boolean negetive false; // 负数
private boolean isZero false; // 分母为零
private long totalNumerator; // 参与运算的分子整数原来分子
public static long paraseNumerator(String s){
//只需从字符串中将分子截取出来
return Long.parseLong(s.substring(0, s.indexOf(/)));
}
public static long paraseDenominator(String s){
//只需从字符串中将分子截取出来
return Long.parseLong(s.substring(s.indexOf(/)1, s.length()));
}
public Rational(long n, long d){
// 在输入的时候分母永远不可能为0但是经过计算之后分母可能会为0
if(0 d){
isZero true;
return;
}
// 如果分子小于0表示为负数
if(n 0){
negetive !negetive;
}
// 在输入的时候分母永远不可能小于0但是经过计算之后分母也可能会小于0
if(d 0){
negetive !negetive;
}
// 如果输入是假分数需要将其调整为真分数,比如5 / 3 1 2/3
integer n / d;
numerator n - integer * d;
denominator Math.abs(d);
// 如果分数不是最简的形式需要将其约分为最简的形式比如10 / 15---2/3
// 在分子和分母的基础之上分别处以分子和分母的最大公约数
if(numerator 1 || numerator -1){
long gcd calcGCD(Math.abs(numerator), denominator);
if(gcd 0){
numerator / gcd;
denominator / gcd;