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

    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
    注意:
      两个整型数据的运算可能会超过整型,所以一开始就要使用long long来进行运算。
    #include<iostream>
    #include<string>
    #include<vector>
    #include<string>
    #include<cstdio>
    #include<cmath>
    #include<string.h>
    #include<algorithm>
    #include<unordered_map>
    #include<stack>
    #include<map>
    #include<regex>
    using namespace std;
    
    struct Node
    {
        long long int up;
        long long int down;
    };
    
    int gcd(long long int b,long long int c)
    {
        if(c==0)
            return b;
        else
            return gcd(c,b%c);
    }
    
    void reduce(Node &temp)
    {
        if(temp.down<0)
        {
            temp.up=-temp.up;
            temp.down=-temp.down;
        }
        int common=gcd(abs(temp.up),temp.down);
        if(common==0)
            return;
        temp.up/=common;
        temp.down/=common;
        if(temp.up==0)
            temp.down=1;
    }
    
    void add(Node& A,Node& B,Node& sum)
    {
        sum.up=A.up*B.down+A.down*B.up;
        sum.down=A.down*B.down;
        reduce(sum);
    }
    
    void sub(Node& A,Node& B,Node& dif)
    {
        dif.up=A.up*B.down-A.down*B.up;
        dif.down=A.down*B.down;
        reduce(dif);
    }
    
    void multi(Node& A,Node& B,Node& res)
    {
        res.up=A.up*B.up;
        res.down=A.down*B.down;
        reduce(res);
    }
    
    bool div(Node& A,Node& B,Node& res)
    {
        if(B.up==0)
            return false;
        res.up=A.up*B.down;
        res.down=A.down*B.up;
        reduce(res);
        return true;
    }
    
    void print(Node temp)
    {
        int sign=1;
        if(temp.up==0)
        {
            printf("0");
            return;
        }
        if(temp.up<0)
        {
            printf("(");
            sign=-1;
        }
        if(abs(temp.up)>=temp.down)
        {
            printf("%lld",temp.up/temp.down);
            if(abs(temp.up)%temp.down>0)
            {
                printf(" %lld/%lld",abs(temp.up)%temp.down,temp.down);
            }
        }
        else
        {
            printf("%lld/%lld",temp.up,temp.down);
        }
        if(temp.up<0)
            printf(")");
    }
    
    void output(Node&A,Node&B,Node&res,char sign,bool flag)
    {
        print(A);
        printf(" %c ",sign);
        print(B);
        printf(" = ");
        if(sign=='/'&&!flag)
        {
            printf("Inf
    ");
            return;
        }
        print(res);
        printf("
    ");
    
    
    }
    
    int main()
    {
    
        Node A,B,res;
        scanf("%lld/%lld %lld/%lld",&A.up,&A.down,&B.up,&B.down);
        reduce(A);
        reduce(B);
        add(A,B,res);
        bool flag=true;
        output(A,B,res,'+',flag);
        sub(A,B,res);
        output(A,B,res,'-',flag);
        multi(A,B,res);
        output(A,B,res,'*',flag);
        flag=div(A,B,res);
        output(A,B,res,'/',flag);
        return 0;
    }
     
  • 相关阅读:
    UVA 1262 Password(密码)(暴力枚举)
    【POJ 3468】A Simple Problem with Integers【树状数组】
    【洛谷P3368】【模板】树状数组2【树状数组】
    【洛谷P3368】【模板】树状数组2【树状数组】
    【洛谷P3368】【模板】树状数组2【树状数组】
    【洛谷P1955】程序自动分析【并查集】【离散】
    【洛谷P1955】程序自动分析【并查集】【离散】
    【洛谷P1955】程序自动分析【并查集】【离散】
    【CH 4201】楼兰图腾【树状数组】
    【CH 4201】楼兰图腾【树状数组】
  • 原文地址:https://www.cnblogs.com/zhanghaijie/p/10407639.html
Copyright © 2011-2022 走看看