PAT-basic-1034 有理数四则运算

发布时间 2023-04-21 02:44:52作者: 正明小佐

一、题目


本题要求编写程序,计算 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

二、解析


细节题,首先要注意输出格式,这里选择先将每一个有理数转化为要求的格式,然后统一加减乘除。定义加减乘除的时候需要注意除法,分母为0的情况。此外控制负数最好只出现在分子。

三、代码


java :

查看代码
 package shuati;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Scanner;

public class PAT_BASIC_1034 {
    private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    private static Scanner input = new Scanner(System.in);
    public static void main(String[] args) throws IOException {
        String str[] = input.nextLine().split("[\\s+/]");
        Rational r1 = new Rational(Long.parseLong(str[0]), Long.parseLong(str[1]));
        Rational r2 = new Rational(Long.parseLong(str[2]), Long.parseLong(str[3]));
        Rational.printRes(r1, r2);

//        Rational r = new Rational(24, 36);
//        long gdb = r.getGdb();
//        System.out.println(gdb);
    }
    private static class Rational{
        long fz;
        long fm;
        public Rational() {}
        public Rational(long fz, long fm) {
            if(fm<0 && fz<0 || fm<0 && fz>0){
                fz = -1 * fz;
                fm = -1 * fm;
            }
            long gcd = getGcd(fz, fm);
            this.fz = fz/gcd;
            this.fm = fm/gcd;
//            System.out.println("gcd: " + gcd +", Rational: " + this.fz +  " " + this.fm);
        }
        public String getString(){
            if(fz == 0 || fm == 0) return "0";
            long num1 = Math.abs(fz);
            long num2 = fm;
            StringBuffer buf = new StringBuffer();
            if(fz < 0)
                buf.append("(-");
            if(num1 >= num2){
                long k = num1/num2;
                long a = num1 - k*num2;
                buf.append(k);
                if(a != 0){
                    buf.append(" ");
                    buf.append(a + "/" + num2);
                }
            }else
                buf.append(num1 + "/" + num2);
            if(fz < 0)
                buf.append(")");
            return buf.toString();
        }
        public long getGcd(long fz, long fm){
            if(fz==0 || fm ==0) return 1;
            long num1 = Math.abs(fz), num2 = Math.abs(fm);
            long temp = num1 % num2;
            while(temp != 0){
                num1 = num2;
                num2 = temp;
                temp = num1 % num2;
            }
            return num2;
        }
        public static void printRes(Rational r1, Rational r2){
            String s1 = r1.getString();
            String s2 = r2.getString();
            System.out.printf("%s + %s = %s\n",s1 , s2, add(r1, r2).getString());
            System.out.printf("%s - %s = %s\n",s1 , s2, sub(r1, r2).getString());
            System.out.printf("%s * %s = %s\n",s1 , s2, mul(r1, r2).getString());
            if(div(r1, r2) == null)
                System.out.printf("%s / %s = Inf\n", s1, s2);
            else
                System.out.printf("%s / %s = %s\n",s1 , s2, div(r1, r2).getString());
        }
        public static Rational add(Rational r1, Rational r2){
            long fz1 = r1.fz, fm1 = r1.fm;
            long fz2 = r2.fz, fm2 = r2.fm;
            long newFm = fm1 * fm2;
            long newFz = fz1*fm2 + fz2*fm1;
            Rational res = new Rational(newFz, newFm);
            return res;
        }
        public static Rational sub(Rational r1, Rational r2){
            long newFm = r1.fm * r2.fm;
            long newFz = r1.fz*r2.fm - r2.fz*r1.fm;
            return new Rational(newFz, newFm);
        }
        public static Rational mul(Rational r1, Rational r2){
            long newFm = r1.fm * r2.fm;
            long newFz = r1.fz * r2.fz;
            return new Rational(newFz, newFm);
        }
        public static Rational div(Rational r1, Rational r2){
            if(r2.getString().equals("0")) return null;
            long newFm = r1.fm * r2.fz;
            long newFz = r1.fz * r2.fm;
            return new Rational(newFz, newFm);
        }
    }
}

c++:

查看代码
 //
// Created by dongdong on 2023/4/13.
//

#include "iostream"

typedef long long Long;

class Rational{

public:
    Long fz;
    Long fm;
    Rational(){};
    Rational(Long fz, Long fm){
        if(fm<0 && fz<0 || fm<0 && fz>0){
            fz = -1 * fz;
            fm = -1 * fm;
        }
        Long gcd = getGcd(fz, fm);
        this->fz = fz/gcd;
//        printf("fenmu: %lld\n", fm);
        this->fm = fm/gcd;
//        printf("INITIAL: %lld %lld %lld\n", gcd, this->fz, this->fm);
    }
    std::string getString(){
        if(fz == 0 || fm == 0) return "0";
        Long num1 = std::abs(fz);
        Long num2 = fm;
        std::string buf;
        if(fz < 0)
            buf.append("(-");
        if(num1 >= num2){
            Long k = num1 / num2;
            Long a = num1 - k*num2;
            buf.append(std::to_string(k));
            if(a != 0){
                buf.append(" ");
                buf.append(std::to_string(a) + "/" + std::to_string(num2));
            }
        }else{
            buf.append(std::to_string(num1)+"/"+std::to_string(num2));
        }
        if(fz < 0)
            buf.append(")");
        return buf;
    };

    Long getGcd(Long fz, Long fm){
        if(fz==0 || fm==0) return 1;
        Long num1 = std::abs(fz), num2 = std::abs(fm);
        Long temp = num1 % num2;
        while(temp != 0){
            num1 = num2;
            num2 = temp;
            temp = num1 % num2;
        }
        return num2;
    }

    static void printRes(Rational r1, Rational r2){
        std::string s1 = r1.getString();
        std::string s2 = r2.getString();
        printf("%s + %s = %s\n",s1.c_str() , s2.c_str(), add(r1, r2).getString().c_str());
        printf("%s - %s = %s\n",s1.c_str() , s2.c_str(), sub(r1, r2).getString().c_str());
        printf("%s * %s = %s\n",s1.c_str() , s2.c_str(), mul(r1, r2).getString().c_str());
        if(r2.getString().compare("0") == 0)
            printf("%s / %s = Inf\n", s1.c_str(), s2.c_str());
        else
            printf("%s / %s = %s\n",s1.c_str(), s2.c_str(), div(r1, r2).getString().c_str());
    }

    static Rational add(Rational r1, Rational r2){
        Long fz1 = r1.fz, fm1 = r1.fm;
        Long fz2 = r2.fz, fm2 = r2.fm;
        Long newFm = fm1 * fm2;
        Long newFz = fz1*fm2 + fz2*fm1;
        Rational res(newFz, newFm);
        return res;
    }
    static Rational sub(Rational r1, Rational r2){
        Long newFm = r1.fm * r2.fm;
        Long newFz = r1.fz*r2.fm - r2.fz*r1.fm;
        return Rational(newFz, newFm);
    }
     static Rational mul(Rational r1, Rational r2){
        long newFm = r1.fm * r2.fm;
        long newFz = r1.fz * r2.fz;
        return Rational(newFz, newFm);
    }
    static Rational div(Rational r1, Rational r2){
//        if(r2.getString().compare(0) == 0) return Rational();
        long newFm = r1.fm * r2.fz;
        long newFz = r1.fz * r2.fm;
        return Rational(newFz, newFm);
    }
};
int main(){
    Long a1, a2, b1, b2;
    scanf("%lld/%lld %lld/%lld", &a1, &a2, &b1, &b2);
//    printf("%lld %lld %lld %lld\n", a1, a2, b1, b2);
    Rational r1(a1, a2);
    Rational r2(b1, b2);
    Rational::printRes(r1, r2);
    return 0;
}