P1572 计算分数 题解

· · 题解

题外话

在进入正题之前,先介绍一下 c++ 一些好用的东西(STL 是 c++ 的宝库!)。

  1. jian(fs a,fs b) 计算分数 a-b,返回值也是分数。
    fs jian(fs x,fs y)
    {
    long long z=x.fm*y.fm;
    x.fz*=y.fm;
    y.fz*=x.fm;
    x.fm=z;
    y.fm=z;
    fs answer;
    answer.fz=x.fz-y.fz;
    answer.fm=x.fm;
    return yf(answer);//就不解释了,可按照加法自行理解
    }
  2. 主函数。
    int main()
    {
    fs a,b;
    char ysf;
    scanf("%lld/%lld",&a.fz,&a.fm);//输入第一个分数,后面就按 [运算符 分数] 格式读入
    cin>>ysf;//输入运算符
    while (scanf("%lld/%lld",&b.fz,&b.fm)!=EOF)//保证读入不为空
    {
        if (ysf==EOF)break;//如果输入的运算符本身为空,跳出
        else if (ysf=='+'){a=jia(a,b);}//把a赋值成a+b结果,之后输入b再运算
        else if (ysf=='-'){a=jian(a,b);}//a-b,同上
        cin>>ysf;//最后输入下一个运算符
    }
    if (a.fm<0&&a.fz>0)//如果分母乘着乘着就变成了负数
    {
        a.fm=abs(a.fm);
        a.fz-=a.fz*2;//分子变负,分母变正
    }
    if (a.fm==1)cout<<a.fz;//特判分母为1,直接输出分子
    else cout<<a.fz<<'/'<<a.fm;//不然照常输出
    return 0;
    }

    不过只能得 \text{Unaccped} \ 100 分。因为第一次输入没有约分,所以如果只有 1 个分数,就会输出原来的分数,就不是约分过的了。所以输入时就先约分一次,如下所示。

    code

    #include <bits/stdc++.h>//万能头文件
    using namespace std;
    struct fs
    {
    long long fm,fz;
    };
    fs yf(fs a)
    {
    long long m=__gcd(a.fm,a.fz);
    a.fm/=m;
    a.fz/=m;
    return a;
    }
    fs jia(fs x,fs y)
    {
    long long z=x.fm*y.fm;
    x.fz*=y.fm;
    y.fz*=x.fm;
    x.fm=z;
    y.fm=z;
    fs answer;
    answer.fz=x.fz+y.fz;
    answer.fm=x.fm;
    return yf(answer);
    }
    fs jian(fs x,fs y)
    {
    long long z=x.fm*y.fm;
    x.fz*=y.fm;
    y.fz*=x.fm;
    x.fm=z;
    y.fm=z;
    fs answer;
    answer.fz=x.fz-y.fz;
    answer.fm=x.fm;
    return yf(answer);//约分是个好习惯
    }
    int main()
    {
    fs a,b;
    char ysf;
    scanf("%lld/%lld",&a.fz,&a.fm);
    a=yf(a);
    cin>>ysf;
    while (scanf("%lld/%lld",&b.fz,&b.fm)!=EOF)
    {
        if (ysf==EOF)break;
        else if (ysf=='+'){a=jia(a,b);}
        else if (ysf=='-'){a=jian(a,b);}
        cin>>ysf;
    }
    if (a.fm<0&&a.fz>0)
    {
        a.fm=abs(a.fm);
        a.fz-=a.fz*2;
    }
    if (a.fm==1)cout<<a.fz;
    else cout<<a.fz<<'/'<<a.fm;
    return 0;
    }

    约法三章

  3. 这个是最长的题解,不要毁谤,谢谢。
  4. 题解写了一天半,你若喜欢请点赞。若你抄袭不点赞,被举报有你好看。
  5. 有问题欢迎指正。如果有 hack 数据,我会尽快改正!