pat a1081

Given N rational numbers in the form numerator/denominator, you are supposed to calculate their sum.

Input Specification:

Each input file contains one test case. Each case starts with a positive integer N (≤100), followed in the next line N rational numbers a1/b1 a2/b2 … where all the numerators and denominators are in the range of long int. If there is a negative number, then the sign must appear in front of the numerator.

Output Specification:

For each test case, output the sum in the simplest form integer numerator/denominator where integer is the integer part of the sum, numerator < denominator, and the numerator and the denominator have no common factor. You must output only the fractional part if the integer part is 0.

Sample Input 1:

5
2/5 4/15 1/30 -2/60 8/3
Sample Output 1:

3 1/3
Sample Input 2:

2
4/3 2/3
Sample Output 2:

2
Sample Input 3:

3
1/3 -1/6 1/8
Sample Output 3:

7/24

代码

#include<stdio.h>
typedef long long ll;
struct fen
{
    ll zi;
    ll mu;
    ll jia=0;
};
fen huajian(fen a)
{
    if(a.zi>=a.mu)
    {
        a.jia=a.zi/a.mu;
        a.zi=a.zi-a.zi/a.mu*a.mu;
    }
    return a;
}
ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}
fen jia(fen a,fen b)
{
    fen sum;
    sum.zi=a.zi*b.mu+a.mu*b.zi;
    sum.mu=a.mu*b.mu;
    if(sum.zi!=0)
    {
        ll q=gcd(sum.zi,sum.mu);
        sum.zi=sum.zi/q;
        sum.mu=sum.mu/q;
    }
    return sum;
}
int main()
{
    ll gcd(ll a,ll b);
    fen jia(fen a,fen b);
    fen huajian(fen a);
    int n;
    scanf("%d",&n);
    fen f[n];
    fen sum;
    scanf("%lld/%lld",&sum.zi,&sum.mu);
    for(int i=1;i<n;i++)
    {
        scanf("%lld/%lld",&f[i].zi,&f[i].mu);
        sum=jia(sum,f[i]);
    }
    sum=huajian(sum);
    if(sum.zi!=0)
    {
        ll q=gcd(sum.zi,sum.mu);
        sum.zi=sum.zi/q;
        sum.mu=sum.mu/q;
    }
    if(sum.zi!=0&&sum.jia!=0)
    printf("%lld %lld/%lld",sum.jia,sum.zi,sum.mu);
    else if(sum.zi==0)
        printf("%lld",sum.jia);
    else if(sum.jia==0)
        printf("%lld/%lld",sum.zi,sum.mu);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值