0
点赞
收藏
分享

微信扫一扫

【PTA-乙级】1034-有理数四则运算

Sky飞羽 2022-02-08 阅读 50

阿这...从输入ctrl+v这个图片到写出这几句话,又看了若干时间手机= =

先给出我写出的解法吧

#include<iostream>
using namespace std;
#include<cmath>

void huajian(long long& a, long long& b)
{
    // 比如 8 6 ;
    // 先求最大公约数 2 
    long long x = a;
    long long y = b;
    if (x < y)
        swap(x, y);
    long long z;
    while(x%y)
    {
        z=x%y;
        x=y;
        y=z;
    }
    a/=y;
    b/=y;
}

void print(long long a, long long b)
{
    // 考虑到加减乘除 加: 按那种方式 分母一定不为0 分子为正则为正 分子为负则为负 
    // 考虑减: 分母一定不为0且为正 分子还是正常  考虑乘 :分母正,分子正常 
    // 考虑除: 分子分母都有可能为负 若都是负 则为正 若一方为负 则为负 且一方为0则为Inf
    // 综上 也就是 加减乘都是看分子 为正则为正 除的话 若一方为负才为负 所以是否带负号还是看相乘的结果

    // 现在考虑0: 若打印等号左边的 : 第一个为0则打印0  运算后的:除:若右边为0则为INF
    if (!b)
    {
        cout << "Inf";
        return;
    }

    if (!a)
    {
        cout << "0";
        return;
    }
    //if (a == 0 || b == 0)
    //{
    //    printf("%s", !b ? "Inf" : "0");
    //}

    // -4 2
    // 下面的也就是ab都不为0
    bool prime = ((a < 0 && b > 0) || (a > 0 && b < 0));
    if (prime)
        printf("(-");
    long long x = fabs(a);
    long long y = fabs(b);
    huajian(x, y);
    long long z = x / y;
    int flag = 0;
    if (z) //z不是0则输出
    {
        cout << z;
        flag = 1;  //只有左边输出且右边输出才输出中间的空格
    }
    x %= y;
    if (x&&flag)
        printf(" %d/%d", x, y);
    else if(x&&!flag)
        printf("%d/%d", x, y);
    if (prime)
        printf(")");
}

int main()
{
    long long a, b, c, d;
    scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);
    //  2/3 -4/2
    print(a, b); printf(" + "); print(c, d); printf(" = "); print(a*d+b*c,b*d); printf("\n");
    print(a, b); printf(" - "); print(c, d); printf(" = "); print(a*d-b*c,b*d); printf("\n");
    print(a, b); printf(" * "); print(c, d); printf(" = "); print(a*c,b*d); printf("\n");
    print(a, b); printf(" / "); print(c, d); printf(" = "); print(a*d,b*c);
    return 0;
}

下面这个输出方式是我最开始没想到的,且我都不知道怎么实现这样的两个分数的相加减等等。就很无语。在print函数前几行,是我思考的一些好像没必要思考的东西。我在思考加减乘除的各种情况。最后发现好像没有什么意义= =

柳神的代码

#include <iostream>
#include <cmath>
using namespace std;
long long a, b, c, d;
long long gcd(long long t1, long long t2) {
    return t2 == 0 ? t1 : gcd(t2, t1 % t2);
}
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 ? ")" : "");
}
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;
}
举报

相关推荐

0 条评论