pat 乙级 1034 四则运算表示

pat乙级1034

    输入:
    2/3 -4/2
    输出:
    2/3 + (-2) = (-1 1/3)
    2/3 - (-2) = 2 2/3
    2/3 * (-2) = (-1 1/3)
    2/3 / (-2) = (-1/3)

需要两个函数,第一个func是对两个数字(分子和分母进行化简)第二个函数gcd是对两个数字求最大公因数
gcd函数

    long long gcd(long long t1, long long t2) {
        return t2 == 0 ? t1 : gcd(t2, t1 % t2);
    }

第一次比如 10 6,将10中的6抹去变成6 4 再寻找他们的最大公因数,如果找到这个数字x就可以把之前抹去的6分解为若干个x同样达到最大公因数效果,如果没找到则再进行
一次将6中4抹去,变成 4 2(注意每一次要将t2变成t1因为要把大的放在前面,如果一开始是6 10,进行一次gcd函数会变成 10 6)最终找到非1的最大公因数x==2,返回。
func函数

    void func(long long m, long long n) {
        if (m * n == 0) {//判断有零的情况下处理
            printf("%s", n == 0 ? "Inf" : "0");
            return ;
        }
        bool flag = ((m < 0 && n > 0) || (m > 0 && n < 0));//如果分子分母异号就添加负号
        m = abs(m); n = abs(n);
        long long x = m / n;
        printf("%s", flag ? "(-" : "");//是否添加符号
        if (x != 0) printf("%lld", x);//假分数
        if (m % n == 0) {
            if(flag) printf(")");
            return ;
        }
        if (x != 0) printf(" ");//假分数输出一个空格
        m = m - x * n;
        long long t = gcd(m, n);//约分
        m = m / t; n = n / t;
        printf("%lld/%lld%s", m, n, flag ? ")" : "");
    }

main函数

    int main() {
        scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);//读取四个数字下面四个依次进行加减乘除,每一次都相当于进行一次对分子分母化简
        func(a, b); printf(" + "); func(c, d); printf(" = "); func(a * d + b * c, b * d); printf("\n");
        func(a, b); printf(" - "); func(c, d); printf(" = "); func(a * d - b * c, b * d); printf("\n");
        func(a, b); printf(" * "); func(c, d); printf(" = "); func(a * c, b * d); printf("\n");
        func(a, b); printf(" / "); func(c, d); printf(" = "); func(a * d, b * c);
        return 0;
    }

版权声明:本文为CSDN博主「柳婼」的原创文章,遵循CC 4.0 BY-SA版权协议。
原文链接:https://blog.csdn.net/liuchuo/article/details/51994755

posted @ 2022-02-26 15:37  天然气之子  阅读(39)  评论(0编辑  收藏  举报