天梯赛试题 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正则表达式1951

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值