EOJ 3041 分数的加减运算

题目简介


一行由若干个分数(格式:分子 / 分母,1≤分子,分母≤1e9)加减运算组成的表达式,计算并以最简分数形式输出表达式的值 (保证:-1e18≤分子,分母≤1e18)。

说明


分数模板练习。再重载一个减号似乎是更为方便的做法。

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
string s;
int len, pos;
ll tmp, num;

struct frac
{
    ll nume, deno;
    ll gcd(ll a, ll b)
    {
        a = abs(a); b = abs(b);
        return b ? gcd(b, a % b) : a;
    }
    void reduct()
    {
        if(!nume) {
            deno = 1;
            return;
        }
        ll g = gcd(nume, deno);
        nume /= g; deno /= g;
        return;
    }
    frac(ll a, ll b = 1)
    {
        nume = a; deno = b;
        (*this).reduct();
    }
    void print()
    {
        if(deno == 1) printf("%lld\n", nume);
        else printf("%lld/%lld\n", nume, deno);
    }
};

frac operator+(const frac& a, const frac& b)
{
    frac ret(a.nume*b.deno + b.nume*a.deno, a.deno*b.deno);
    ret.reduct();
    return ret;
}

void readnum()
{
    while (pos < len && isdigit(s[pos])) {
        num = num * 10 + s[pos] - '0';
        ++pos;
    }
}

int main()
{
    int cas, n;
    cin >> cas;
    for(int t = 0; t < cas; ++t) {
        cin >> n >> s;
        len = s.size();
        frac ans(0);
        for (pos = 0; pos < len;) {
            num = 0;
            int flag = 1;
            if (s[pos] == '+') ++pos;
            if (s[pos] == '-') {
                flag = -1;
                ++pos;
            }
            readnum();
            tmp = num * flag; num = 0; ++pos;
            readnum();
            frac(tmp, num);
            ans = ans + frac(tmp, num);
        }
        printf("case #%d:\n", t);
        ans.print();
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值