团体程序设计天梯赛-练习集 L1-009 分数加法模板

来源:互联网 发布:spark sql ppt 编辑:程序博客网 时间:2024/05/05 09:13
#include <cstdio>#include <algorithm>using namespace std;typedef long long ll;int n;char buff[32];ll gcd(ll a, ll b) {    if (b==0)        return a;    return gcd(b, a%b);}struct frac {    ll up, down;    frac(ll _up=0, ll _down=1) {        up=_up;        down=_down;        if (up&down) {            ll temp=gcd(abs(up), abs(down));            up/=temp;            down/=temp;        }    }    friend frac operator+(const frac &f1, const frac &f2) {        frac res;        ll lcm=f1.down/gcd(abs(f1.down), abs(f2.down))*f2.down;        res.up=f1.up*(lcm/f1.down)+f2.up*(lcm/f2.down);        res.down=lcm;        if (res.up&res.down) {            ll temp=gcd(abs(res.up), abs(res.down));            res.up/=temp;            res.down/=temp;        }        return res;    }    friend frac operator+=(const frac &f1, const frac &f2) {        return f1+f2;    }};int main(){    //freopen("in.txt", "r", stdin);    scanf("%d", &n);    frac res;    for (int i=0; i<n; i++) {        scanf("%s", buff);        ll up, down;        sscanf(buff, "%lld/%lld", &up, &down);        res=res+frac(up, down);    }    if (res.up==0)        puts("0");    else if (abs(res.up)<abs(res.down))        printf("%lld/%lld\n", res.up, res.down);    else {        if (res.up%res.down==0)            printf("%lld\n", res.up/res.down);        else            printf("%lld %lld/%lld\n", res.up/res.down, res.up%res.down, res.down);    }    return 0;}

0 0
原创粉丝点击