L1-009 N个数求和

L1-009 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型,卡了我好久

#include<iostream>
#include<stdio.h>
#include<map>
#include<string.h>
#define ll long long
using namespace std;
char c;
ll gcd(ll a, ll b)
{
    return b == 0 ? a : gcd(b, a%b);
}
ll lcm(ll a, ll b)
{
    return  a/gcd(a, b)*b;
}
int main()
{
    ll t, x, y, x1, y1, d = 1, m = 1;
    cin >> t;
    cin >> x1 >> c >> y1;
    for (ll i = 0; i < t-1; i++)
    {
        cin >> x >> c >> y;
        m = lcm(y1, y);
        x1 = m / y1 * x1 + m / y * x;
        y1 = m;
    }
    d = gcd(x1, y1);
    if (d != 1)//先化为互质的两个数
    {
        x1 = x1 / d;
        y1 = y1 / d;
    }
    if (x1%y1 == 0)
        cout << x1 / y1 << endl;

    else if (x1 > y1)
    {
        cout << x1 / y1 << ' ';
        cout << x1 - (x1 / y1)*y1 << '/' << y1 << endl;
    }
    else
    {
        cout << x1 << '/' << y1 << endl;
    }
    //system("pause");
    return 0;
}

 

posted @ 2019-03-26 18:54  知道了呀~  阅读(909)  评论(0编辑  收藏  举报