1034 有理数四则运算 java答案
这道题要注意的是数据类型应该用long,整型变量加减乘除使用int作为数据类型的话可能会出现数据溢出的问题
除了这点,这道题还涉及到辗转相除法求两个数的最大公约数:
用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main{
public static void main(String[] args) throws NumberFormatException, IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String[] strs=br.readLine().split(" ");
br.close();
numAdd(strs[0],strs[1]);
numSub(strs[0],strs[1]);
numMult(strs[0],strs[1]);
numDivi(strs[0],strs[1]);
}
// 化简分数形式有理数
public static String numSimply(String str) {
String[] strs=str.split("/");
Long str1=Long.parseLong(strs[0]);//分子
Long str2=Long.parseLong(strs[1]);//分母
if(str2<0) {
str2=-str2;
str1=-str1;
}
Long num1=str1/str2;
Long num2=str1%str2;
if(num2<0) {
num2=-num2;
}
// 真分数
if(num1==0&&num2!=0) {
Long gcd=getGCD(str1,str2);
str=str1/gcd+"/"+str2/gcd;
// 判断str1是正数还是负数
if(str1>0) {
return str;
}else {
return "("+str+")";
}
}
// 整数
else if(num2==0&&num1!=0) {
String result=String.valueOf(num1);
// 判断str1是正数还是负数
if(str1>0) {
return result;
}else {
return "("+result+")";
}
}
// 为0
else if(num1==0&&num2==0) {
return "0";
}
// 假分数
else {
// 对假分数的真分数部分化简
String result1=num2+"/"+str2;
String result2=numSimply(result1);
// 判断num1是正数还是负数
if(num1>0) {
return num1+" "+result2;
}else {
return "("+num1+" "+result2+")";
}
}
}
// 利用辗转相除法求两个数的最大公约数
// 这个方法默认a<b,因为用于真分数的化简,分子一定小于分母
public static Long getGCD(Long a,Long b) {
while(b%a!=0) {
Long temp=b%a;
b=a;
a=temp;
}
// 如果最大公约数是负数,需要把它转换为正数
if(a<0) {
a=-a;
}
return a;
}
// 有理数加法
public static void numAdd(String str1,String str2) {
String[] strs1=str1.split("/");
String[] strs2=str2.split("/");
Long son1=Long.parseLong(strs1[0]);
Long mon1=Long.parseLong(strs1[1]);
Long son2=Long.parseLong(strs2[0]);
Long mon2=Long.parseLong(strs2[1]);
Long son3=son1*mon2+son2*mon1;
Long mon3=mon1*mon2;
String str3=son3+"/"+mon3;
String result1=numSimply(str1);
String result2=numSimply(str2);
String result3=numSimply(str3);
System.out.println(result1+" + "+result2+" = "+result3);
}
// 有理数减法
public static void numSub(String str1,String str2) {
String[] strs1=str1.split("/");
String[] strs2=str2.split("/");
Long son1=Long.parseLong(strs1[0]);
Long mon1=Long.parseLong(strs1[1]);
Long son2=Long.parseLong(strs2[0]);
Long mon2=Long.parseLong(strs2[1]);
Long son3=son1*mon2-son2*mon1;
Long mon3=mon1*mon2;
String str3=son3+"/"+mon3;
String result1=numSimply(str1);
String result2=numSimply(str2);
String result3=numSimply(str3);
System.out.println(result1+" - "+result2+" = "+result3);
}
// 有理数乘法
public static void numMult(String str1,String str2) {
String[] strs1=str1.split("/");
String[] strs2=str2.split("/");
Long son1=Long.parseLong(strs1[0]);
Long mon1=Long.parseLong(strs1[1]);
Long son2=Long.parseLong(strs2[0]);
Long mon2=Long.parseLong(strs2[1]);
Long son3=son1*son2;
Long mon3=mon1*mon2;
String str3=son3+"/"+mon3;
String result1=numSimply(str1);
String result2=numSimply(str2);
String result3=numSimply(str3);
System.out.println(result1+" * "+result2+" = "+result3);
}
// 有理数除法
public static void numDivi(String str1,String str2) {
String[] strs1=str1.split("/");
String[] strs2=str2.split("/");
Long son1=Long.parseLong(strs1[0]);
Long mon1=Long.parseLong(strs1[1]);
Long son2=Long.parseLong(strs2[0]);
Long mon2=Long.parseLong(strs2[1]);
String result1=numSimply(str1);
String result2=numSimply(str2);
if(result2.equals("0")) {
System.out.print(result1+" / "+result2+" = Inf");
}else {
Long son3=son1*mon2;
Long mon3=mon1*son2;
String str3=son3+"/"+mon3;
String result3=numSimply(str3);
System.out.print(result1+" / "+result2+" = "+result3);
}
}
}