当前位置: 代码迷 >> 综合 >> PAT 1034 有理数四则运算(JAVA)
  详细解决方案

PAT 1034 有理数四则运算(JAVA)

热度:44   发布时间:2023-11-24 15:38:08.0

本题要求编写程序,计算 2 个有理数的和、差、积、商。

输入格式:
输入在一行中按照 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

这题有两个坑点
1.用int有两个用例过不去
2.注意除法时有负号的话,负号会从分子转移到分母

import java.util.*;
import java.io.*;
public class Main{
    public static void main(String[]args)throws IOException{
    BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));String []strs=bf.readLine().split("\\s+|/");long fz=Long.parseLong(strs[0]);long fm=Long.parseLong(strs[1]);long sz=Long.parseLong(strs[2]);long sm=Long.parseLong(strs[3]);System.out.println(plus(fz,fm,sz,sm));System.out.println(minus(fz,fm,sz,sm));System.out.println(multiply(fz,fm,sz,sm));System.out.println(divide(fz,fm,sz,sm));}//最大公约数private static long gcd(long a,long b){
    a=Math.abs(a);b=Math.abs(b);while(b!=0){
    long p=a%b;a=b;b=p;}return a;}//加private static String plus(long fz,long fm,long sz,long sm){
    long ansFz=fz*sm+fm*sz;long ansFm=fm*sm;return getS(fz,fm)+" + "+getS(sz,sm)+" = "+getS(ansFz,ansFm);}//减private static String minus(long fz,long fm,long sz,long sm){
    long ansFz=fz*sm-fm*sz;long ansFm=fm*sm;return getS(fz,fm)+" - "+getS(sz,sm)+" = "+getS(ansFz,ansFm);}//乘private static String multiply(long fz,long fm,long sz,long sm){
    long ansFz=fz*sz;long ansFm=fm*sm;return getS(fz,fm)+" * "+getS(sz,sm)+" = "+getS(ansFz,ansFm);}//除private static String divide(long fz,long fm,long sz,long sm){
    if(sz==0)return getS(fz,fm)+" / "+getS(sz,sm)+" = Inf";long ansFz=Math.abs(fz)*sm;long ansFm=Math.abs(sz)*fm;if((fz<0&&sz>0)||(fz>0&&sz<0)) ansFz=-ansFz;return getS(fz,fm)+" / "+getS(sz,sm)+" = "+getS(ansFz,ansFm);}//负责化简private static String getS(long fz,long fm){
    long y=gcd(fz,fm);fz/=y;fm/=y;if(fz%fm==0){
    //能整除fz=fz/fm;if(fz>=0) return String.valueOf(fz);else return "("+String.valueOf(fz)+")"; }else if(Math.abs(fz)>fm){
    //分子大于分母long g=fz/fm;fz=Math.abs(fz)%fm;if(g<0)return "("+String.valueOf(g)+" "+String.valueOf(fz)+"/"+String.valueOf(fm)+")";elsereturn String.valueOf(g)+" "+String.valueOf(fz)+"/"+String.valueOf(fm);}else{
    //其他if(fz<0)return "("+String.valueOf(fz)+"/"+String.valueOf(fm)+")";elsereturn String.valueOf(fz)+"/"+String.valueOf(fm); }}}
  相关解决方案