1034 有理数四则运算 java答案

淩亂°似流年 2022-02-21 05:21 298阅读 0赞

这道题要注意的是数据类型应该用long,整型变量加减乘除使用int作为数据类型的话可能会出现数据溢出的问题
除了这点,这道题还涉及到辗转相除法求两个数的最大公约数:
用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. public class Main{
  5. public static void main(String[] args) throws NumberFormatException, IOException{
  6. BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  7. String[] strs=br.readLine().split(" ");
  8. br.close();
  9. numAdd(strs[0],strs[1]);
  10. numSub(strs[0],strs[1]);
  11. numMult(strs[0],strs[1]);
  12. numDivi(strs[0],strs[1]);
  13. }
  14. // 化简分数形式有理数
  15. public static String numSimply(String str) {
  16. String[] strs=str.split("/");
  17. Long str1=Long.parseLong(strs[0]);//分子
  18. Long str2=Long.parseLong(strs[1]);//分母
  19. if(str2<0) {
  20. str2=-str2;
  21. str1=-str1;
  22. }
  23. Long num1=str1/str2;
  24. Long num2=str1%str2;
  25. if(num2<0) {
  26. num2=-num2;
  27. }
  28. // 真分数
  29. if(num1==0&&num2!=0) {
  30. Long gcd=getGCD(str1,str2);
  31. str=str1/gcd+"/"+str2/gcd;
  32. // 判断str1是正数还是负数
  33. if(str1>0) {
  34. return str;
  35. }else {
  36. return "("+str+")";
  37. }
  38. }
  39. // 整数
  40. else if(num2==0&&num1!=0) {
  41. String result=String.valueOf(num1);
  42. // 判断str1是正数还是负数
  43. if(str1>0) {
  44. return result;
  45. }else {
  46. return "("+result+")";
  47. }
  48. }
  49. // 为0
  50. else if(num1==0&&num2==0) {
  51. return "0";
  52. }
  53. // 假分数
  54. else {
  55. // 对假分数的真分数部分化简
  56. String result1=num2+"/"+str2;
  57. String result2=numSimply(result1);
  58. // 判断num1是正数还是负数
  59. if(num1>0) {
  60. return num1+" "+result2;
  61. }else {
  62. return "("+num1+" "+result2+")";
  63. }
  64. }
  65. }
  66. // 利用辗转相除法求两个数的最大公约数
  67. // 这个方法默认a<b,因为用于真分数的化简,分子一定小于分母
  68. public static Long getGCD(Long a,Long b) {
  69. while(b%a!=0) {
  70. Long temp=b%a;
  71. b=a;
  72. a=temp;
  73. }
  74. // 如果最大公约数是负数,需要把它转换为正数
  75. if(a<0) {
  76. a=-a;
  77. }
  78. return a;
  79. }
  80. // 有理数加法
  81. public static void numAdd(String str1,String str2) {
  82. String[] strs1=str1.split("/");
  83. String[] strs2=str2.split("/");
  84. Long son1=Long.parseLong(strs1[0]);
  85. Long mon1=Long.parseLong(strs1[1]);
  86. Long son2=Long.parseLong(strs2[0]);
  87. Long mon2=Long.parseLong(strs2[1]);
  88. Long son3=son1*mon2+son2*mon1;
  89. Long mon3=mon1*mon2;
  90. String str3=son3+"/"+mon3;
  91. String result1=numSimply(str1);
  92. String result2=numSimply(str2);
  93. String result3=numSimply(str3);
  94. System.out.println(result1+" + "+result2+" = "+result3);
  95. }
  96. // 有理数减法
  97. public static void numSub(String str1,String str2) {
  98. String[] strs1=str1.split("/");
  99. String[] strs2=str2.split("/");
  100. Long son1=Long.parseLong(strs1[0]);
  101. Long mon1=Long.parseLong(strs1[1]);
  102. Long son2=Long.parseLong(strs2[0]);
  103. Long mon2=Long.parseLong(strs2[1]);
  104. Long son3=son1*mon2-son2*mon1;
  105. Long mon3=mon1*mon2;
  106. String str3=son3+"/"+mon3;
  107. String result1=numSimply(str1);
  108. String result2=numSimply(str2);
  109. String result3=numSimply(str3);
  110. System.out.println(result1+" - "+result2+" = "+result3);
  111. }
  112. // 有理数乘法
  113. public static void numMult(String str1,String str2) {
  114. String[] strs1=str1.split("/");
  115. String[] strs2=str2.split("/");
  116. Long son1=Long.parseLong(strs1[0]);
  117. Long mon1=Long.parseLong(strs1[1]);
  118. Long son2=Long.parseLong(strs2[0]);
  119. Long mon2=Long.parseLong(strs2[1]);
  120. Long son3=son1*son2;
  121. Long mon3=mon1*mon2;
  122. String str3=son3+"/"+mon3;
  123. String result1=numSimply(str1);
  124. String result2=numSimply(str2);
  125. String result3=numSimply(str3);
  126. System.out.println(result1+" * "+result2+" = "+result3);
  127. }
  128. // 有理数除法
  129. public static void numDivi(String str1,String str2) {
  130. String[] strs1=str1.split("/");
  131. String[] strs2=str2.split("/");
  132. Long son1=Long.parseLong(strs1[0]);
  133. Long mon1=Long.parseLong(strs1[1]);
  134. Long son2=Long.parseLong(strs2[0]);
  135. Long mon2=Long.parseLong(strs2[1]);
  136. String result1=numSimply(str1);
  137. String result2=numSimply(str2);
  138. if(result2.equals("0")) {
  139. System.out.print(result1+" / "+result2+" = Inf");
  140. }else {
  141. Long son3=son1*mon2;
  142. Long mon3=mon1*son2;
  143. String str3=son3+"/"+mon3;
  144. String result3=numSimply(str3);
  145. System.out.print(result1+" / "+result2+" = "+result3);
  146. }
  147. }
  148. }

发表评论

表情:
评论列表 (有 0 条评论,298人围观)

还没有评论,来说两句吧...

相关阅读

    相关 有理数四则运算

    本题要求编写程序,计算 2 个有理数的和、差、积、商。 输入格式: 输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围

    相关 1034. 有理数四则运算(20)

    本题要求编写程序,计算2个有理数的和、差、积、商。 输入格式: 输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数