【天梯赛】L1-009 N个数求和 (20 分)

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

long long gcd(long long a,long long b){ return !b? a:gcd(b,a%b);}//最大公约数

int main(){
    int n;
    scanf("%d",&n);
    long long t_fz,t_fm,t_zs=0;
    long long res_fz=0,res_fm=1,res_zs=0;
    for(int i=0;i<n;i++){
        scanf("%lld/%lld",&t_fz,&t_fm);
        long long t_gcd=gcd(t_fz,t_fm);
        t_fz/=t_gcd,t_fm/=t_gcd;//化简
        t_zs=t_fz/t_fm,t_fz=t_fz%t_fm;//带分数
        if(t_fm==res_fm){
            res_fz+=t_fz;
        }else{//res_fz*t_fm+t_fz*res_fm/t_fm*res_fm
            t_fm*=res_fm;//t_fm*res_fm
            t_fz*=res_fm;//t_fz*res_fm
            res_fz*=(t_fm/res_fm);
            res_fz+=t_fz;
            res_fm=t_fm;
        }
        long long res_gcd=gcd(res_fz,res_fm);
        res_fz/=res_gcd,res_fm/=res_gcd;//化简
        res_zs+=(t_zs+res_fz/res_fm),res_fz=res_fz%res_fm;//带分数
    }

    if(res_zs!=0){//有整数部分
        printf("%lld",res_zs);
        if(res_fz!=0){//有小数部分
            if(res_fm!=1) printf(" %lld/%lld",res_fz,res_fm);//小数部分为整数
            else          printf(" %lld",res_fz);
        }
    }else{//没有整数部分
        if(res_fm!=1) printf("%lld/%lld",res_fz,res_fm);
        else          printf("%lld",res_fz);
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值