PAT (Advanced Level) Practice::1081 Rational Sum

收获:递归法得求最大公约数m,最小公倍数就是a*b/m

           变量名字,在清晰易懂的基础上,能短就短

 

#include<iostream>
#include<cmath>

using namespace std;

struct RationalNumbers
{
    long long numerator;
    long long denominator;

} rn[100];


long long gcd(long long numerator,long long denominator)
{
    if(denominator==0)
        return numerator;
    else
        return gcd(denominator, numerator % denominator);
}

RationalNumbers reduction(RationalNumbers r)
{
    if(r.denominator<0)
    {
        r.numerator = -r.numerator;
        r.denominator = -r.denominator;
    }
    if(r.numerator==0)
        r.denominator = 1;
    else
    {
        long long d = gcd(abs(r.numerator), abs(r.denominator));
        r.numerator /= d;
        r.denominator /= d;
    }
    return r;
}

RationalNumbers add(RationalNumbers r1,RationalNumbers r2)
{
    RationalNumbers result;

    result.numerator = r1.numerator * r2.denominator + r2.numerator * r1.denominator;
    result.denominator = r1.denominator * r2.denominator;
    
    return reduction(result);
}


void show(RationalNumbers r)
{
    r = reduction(r);
    if(r.denominator==1)
        printf("%lld", r.numerator);
    else if(abs(r.numerator)>r.denominator)
        printf("%lld %lld/%lld\n", r.numerator / r.denominator, 
                                abs(r.numerator) % r.denominator, 
                                    r.denominator);
    else
        printf("%lld/%lld\n", r.numerator, r.denominator);
}

int main()
{
    int n;
    cin >> n;
    RationalNumbers sum{0, 1};
    for (int i = 0; i < n ; i++)
    {
        scanf("%ld/%ld", &rn[i].numerator, &rn[i].denominator);
        sum = add(sum, rn[i]);
    }
    show(sum);
    getchar();
}

 不过,有意思的是我没有通过第三个样例,但最后却拿到了满分

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值