其他分享
首页 > 其他分享> > 天梯赛试题 L1-009 N个数求和

天梯赛试题 L1-009 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

方法一:

思路:先通过求出n个数的最小公倍数,即分母的值;再根据分母的值进行换算,求出分子的和;然后将通过求分子分母的最大公因数进行化简,最后分情况讨论结果。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
/* 计算最小公倍数 */
ll cal_deno(ll a, ll b)
{
    ll gcd = __gcd(a, b);
    ll lcm = a * b / gcd;
    return lcm;
}
int main()
{
    ll n;
    // 获取计算的个数
    cin >> n;
    ll nume[101], deno[101], a = 0, b = 1;
    // nume为分子,deno为分母
    char c;
    /* 计算n个数的最小公倍数b */
    for (int i = 0; i < n; i++)
    {
        cin >> nume[i] >> c >> deno[i];
        //获取分子和分母,并存入数组
        b = cal_deno(b, deno[i]);
    }
    /* 计算n个数的分子之和 */
    for (int i = 0; i < n; i++)
    {
        a = a + b / deno[i] * nume[i];
    }
    ll k = abs(__gcd(a, b));
    //计算分子分母的最大公因数并取绝对值
    a /= k;
    // 化简之后的分子
    b /= k;
    // 化简之后的分母
    if (a % b == 0)
    {
        cout << a / b << endl;
    }
    else
    {
        if (a / b)
            cout << a / b << " ";
        cout << a - a / b * b << "/" << b << endl;
    }
    return 0;
}

方法二:

思路:根据交叉加减法,即a/b+c/d=(ad+bc)/b*d,依次计算每两个数的值,并计算分子分母的最大公因数进行化简。

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

int main()
{
    ll n, a, b, nume, deno = 1;
    char c;
    cin >> n;
    while (n--)
    {
        cin >> a >> c >> b;
        nume = nume * b + a * deno;    // 即a/b+c/d=(a*d+b*c)/b*d的分子部分
        deno *= b;                     // 即a/b+c/d=(a*d+b*c)/b*d的分母部分
        ll k = abs(__gcd(nume, deno)); //计算分子分母的最大公因数并取绝对值
        nume /= k;
        deno /= k;
    }
    /* 判断计算结果是否为整数 */
    if (nume % deno == 0)
        cout << nume / deno << endl;
    else
    {
        /* 判断计算结果整数部分是否为0 */
        if (nume / deno)
            cout << nume / deno << ' ';
        cout << nume - nume / deno * deno << '/' << deno << endl;
    }
    return 0;
}

标签:分子,ll,样例,nume,deno,天梯,L1,009,分母
来源: https://blog.csdn.net/weixin_47429870/article/details/115377960