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);
	  }
  }
}
全部评论

相关推荐

冲芭芭拉鸭:你这图还挺新,偷了。
投递美团等公司10个岗位
点赞 评论 收藏
分享
一名愚蠢的人类:多少games小鬼留下了羡慕的泪水
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务