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