zoukankan      html  css  js  c++  java
  • 1034 有理数四则运算

    1034 有理数四则运算 (20 分)

    本题要求编写程序,计算 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
    肝就完事了
    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    //辗转相除法
    int gcd(long long a, long long b){
        return b == 0 ? a : gcd(b, a % b);
    }
    
    void print(long long a, long long b){
        long long c = 0; //带分数前面的整数部分,默认是0
        if(a > 0){ //正数
            if(b == 1){ //形如3/1
                printf("%lld", a);
            }
            else if(a > b){ //形如5/3
                c = a / b;
                a -= b * c;
                printf("%lld %lld/%lld", c, a, b);
            }
            else{ //真分数 形如3/5
                printf("%lld/%lld", a, b);
            }
        }
        else if(a == 0){ //形如0/3
            printf("%c", '0');
        }
        else{ //负数
            if(b == 1){ //形如-3/1
                printf("(%lld)", a);
            }
            else if(-1 * a > b){ //形如-5/3
                c = a / b;
                a = (-1 * a) % b;
                printf("(%lld %lld/%lld)", c, a, b);
            }
            else{ //真分数
                printf("(%lld/%lld)", a, b);
            }
        }
    }
    
    void add(long long a1, long long b1, long long a2, long long b2){
        print(a1, b1);
        printf(" + ");
        print(a2, b2);
        printf(" = ");
        long long a3 = a1 * b2 + a2 * b1;
        long long b3 = b1 * b2;
        //化简到最简形式,非带分数形式
        long long gcd3 = abs(gcd(a3, b3));
        a3 /= gcd3;
        b3 /= gcd3;
        print(a3, b3);
        printf("
    ");
    }
    
    void subtract(long long a1, long long b1, long long a2, long long b2){
        print(a1, b1);
        printf(" - ");
        print(a2, b2);
        printf(" = ");
        long long a3 = a1 * b2 - a2 * b1;
        long long b3 = b1 * b2;
        //化简到最简形式,非带分数形式
        long long gcd3 = abs(gcd(a3, b3));
        a3 /= gcd3;
        b3 /= gcd3;
        print(a3, b3);
        printf("
    ");
    }
    
    void multiply(long long a1, long long b1, long long a2, long long b2){
        print(a1, b1);
        printf(" * ");
        print(a2, b2);
        printf(" = ");
        long long a3 = a1 * a2;
        long long b3 = b1 * b2;
        //化简到最简形式,非带分数形式
        long long gcd3 = abs(gcd(a3, b3));
        a3 /= gcd3;
        b3 /= gcd3;
        print(a3, b3);
        printf("
    ");
    }
    
    void divide(long long a1, long long b1, long long a2, long long b2){
        print(a1, b1);
        printf(" / ");
        print(a2, b2);
        printf(" = ");
        if(a2 == 0){
            printf("Inf");
        }
        else if(a2 < 0){
            long long a3 = -1 * a1 * b2;
            long long b3 = -1 * b1 * a2;
            //化简到最简形式,非带分数形式
            long long gcd3 = abs(gcd(a3, b3));
            a3 /= gcd3;
            b3 /= gcd3;
            print(a3, b3);
        }
        else{
            long long a3 = a1 * b2;
            long long b3 = b1 * a2;
            //化简到最简形式,非带分数形式
            long long gcd3 = abs(gcd(a3, b3));
            a3 /= gcd3;
            b3 /= gcd3;
            print(a3, b3);
        }
        printf("
    ");
    }
    
    int main(){
        long long a1, b1, a2, b2;
        long long c1 = 0, c2 = 0;
        scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2);
        //先化简到最简形式,非带分数形式
        long long gcd1 = abs(gcd(a1, b1));
        a1 /= gcd1;
        b1 /= gcd1;
        long long gcd2 = abs(gcd(a2, b2));
        a2 /= gcd2;
        b2 /= gcd2;
        //统一用最简形式参与运算
        add(a1, b1, a2, b2);
        subtract(a1, b1, a2, b2);
        multiply(a1, b1, a2, b2);
        divide(a1, b1, a2, b2);
        return 0;
    }
     
  • 相关阅读:
    PHP实现无限极分类
    html2canvas生成并下载图片
    一次线上问题引发的过程回顾和思考,以更换两台服务器结束
    Intellij IDEA启动项目报Command line is too long. Shorten command line for XXXApplication or also for
    mq 消费消息 与发送消息传参问题
    idea 创建不了 java 文件
    Java switch 中如何使用枚举?
    Collections排序
    在idea 设置 git 的用户名
    mongodb添加字段和创建自增主键
  • 原文地址:https://www.cnblogs.com/yfr2zaz/p/10366038.html
Copyright © 2011-2022 走看看