题目描述
Given N rational numbers in the form “numerator/denominator”, you are supposed to calculate their sum.
输入描述:
Each input file contains one test case. Each case starts with a positive integer N (<=100), followed in the next line N rational numbers “a1/b1 a2/b2 …” where all the numerators and denominators are in the range of “long int”. If there is a negative number, then the sign must appear in front of the numerator.
输出描述:
For each test case, output the sum in the simplest form “integer numerator/denominator” where “integer” is the integer part of the sum, “numerator” < “denominator”, and the numerator and the denominator have no common factor. You must output only the fractional part if the integer part is 0.
输入例子:
5
2/5 4/15 1/30 -2/60 8/3
输出例子:
3 1/3
解决代码(参考来源https://www.nowcoder.com/questionTerminal/3f9db00a3df04816ae87c370c24ee14c)
/*
计算分数之和,求最简公约数
输出分数要求:分子<分母,分子、分母无公因子
2019月1月17日
问题:如果保存输入的分数?
gcd最大公约数
*/
#include<bits/stdc++.h> //万能头文件,包含了目前c++所包含的所有头文件
using namespace std;
//辗转相除法求最大公约数
int gcd(int x,int y)
{
int t;
while(y)
{
t=x%y;
x=y;
y=t;
}
return x;
}
int main()
{
int n;
cin >> n;
vector<long long> numerator(n); //存储分子部分
vector<long long> denominator(n); //存储分母部分
long long a, b;
char c;
long long product = 1; //各个数分母相乘的积
for (int i=0; i<n; i++)
{
cin >> a >> c >> b;
numerator[i] = a;
denominator[i] = b;
product *= b;
}
long long sum = 0;
for (int i=0; i<n; i++) //计算通分后分子相加的和
{
long long tmp = product/denominator[i] * numerator[i];
sum += tmp;
}
if (sum==0) //分子和为0,说明分数正负抵消,输出0
{
cout << 0;
return 0;
}
long long num = sum / product; //计算和是否为假分数
a = sum % product;
if (a == 0) //得到的和为整数
{
if (num != 0)
cout << num;
return 0;
}
long long g = gcd(product, a); //约分
a = a/g;
b = product/g;
if (b < 0) //处理负数的情况
{
a *= -1;
b *= -1;
}
if (num != 0)
cout << num << " ";
cout << a << "/" << b;
}