7-10 N个数求和 (20 分)

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

5

2/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

输入样例2:

2

4/3 2/3

输出样例2:

2

输入样例3:

3

1/3 -1/6 1/8

输出样例3:

7/24

这里我说一下我在做题目时遇到的一些问题:

首先第一个就是数据类型的问题,题目说了分子分母都是在长整型范围内,所以我一开始在做的时候用的数据类型都是long类型,但是到后面发现有一个案例总是过不去,一开始我以为是我的计算可能有问题,但是找了半天也没有找出,后来我就去网上看了一些别人写的题解,发现可能是我的数据类型的问题,因为我的是先将两个数进行通分再计算约分,这样就导致两个分母相乘之后就超出了长整型的范围,要用long long类型,我这里为了方便就把全部的都换成了long long类型,换完之后我就AC了

其次就是输出的问题,一开始我只考虑了整数部分跟分数部分都不为0或者这有其中一个为0,但是还有两个都为0的情况,一开始我没有考虑到,就导致有一个案例没有通过,后来加回这种情况就通过了

下面是我做题写的代码:

#include<bits/stdc++.h>
#include<math.h>
using namespace std;
void add(long long *mol1,long long *den1,long long *mol2,long long *den2)
{  //进行两个分数进行相加计算
    *mol1=(*mol1)*(*den2)+(*mol2)*(*den1);
    *den1=(*den1)*(*den2);
}
long long gongyue(long long a,long long b)
{  //求出分子分母的最大公约数
    long long t=1;
    while(t)
    {
    t=a%b;
    a=b;
    b=t;
    }
    return a;
}
int main()
{
    long long mol1,mol2,den1,den2;
    long long inte,n,x; 
    cin>>n;
    scanf("%lld/%lld",&mol1,&den1);
    for(int i=0;i<n-1;i++)
    {
        scanf("%lld/%lld",&mol2,&den2);
        add(&mol1,&den1,&mol2,&den2);  //将两个分数进行相加
        x=abs(gongyue(mol1,den1));  //求出分子分母的最大公约数
        if(x!=0)
        {
        mol1/=x;  //将分子分母进行约分
        den1/=x;
        }
    }
    inte=mol1/den1;  //求出整数部分
    mol1%=den1;  //求出分子部分
    if(inte!=0 && mol1!=0) printf("%lld %lld/%lld\n",inte,mol1,den1);  //将结果进行输出
    if(inte==0 && mol1!=0) printf("%ld/%ld\n",mol1,den1);
    if(inte!=0 && mol1==0) printf("%lld",inte);
    if(inte==0 && (mol1==0||den1==0)) cout<<"0"<<'\n';
    return 0;
}