【题目描述】
输入n个分数并对他们求和,并用最简形式表示。所谓最简形式是指:分子分母的最大公约数为1;若最终结果的分母为1,则直接用整数表示。
如:56、103均是最简形式,而36需要化简为12,31需要化简为3。
分子和分母均不为0,也不为负数。
【输入】
第一行是一个整数n,表示分数个数,1≤n≤10;
接下来n行,每行一个分数,用"p/q"的形式表示,不含空格,p,q均不超过10。
【输出】
输出只有一行,即最终结果的最简形式。若为分数,用"p/q"的形式表示。
【输入样例】
2
1/2
1/3
【输出样例】
5/6
分析
- 此题求分母的和,我们可以对分子、分母分开求解,最后化简;
- 最终和的分母,为这些分母的最小公倍数min,所以我们定义一个求最大公约数的函数gcd,通过这些数的乘积sumb除以最大公约数max求得最小公倍数min;
- 可以参考:最大公约数
- 把通分后的分子和加起来,然后化简分子分母即可
#include <bits/stdc++.h>
using namespace std;
int a[15]; //分子
int b[15]; //分母
//求n个分母的最大公约数
int gcd(int a, int b) {
return (b == 0 ? a : gcd(b, a % b));
}
int main() {
int n;
cin >> n;
char c;
int sumb = 1; //求前n个分母的乘积
for (int i = 0; i < n; i++) {
cin >> a[i] >> c >> b[i];
sumb *= b[i];
}
int max = 1; //保存n个分母的最大公约数
//求前n个分母的最大公约数
for (int i = 0; i < n; i++) {
max = gcd(max, b[i]);
}
//求这n个分母的最小公倍数
int min = sumb / max;
int fz = 0, fm;
//计算n个数的分子和
for (int i = 0; i < n; i++) {
fz += (a[i] * (min / b[i]));
}
fm = min; //分母就是所有分母的最小公倍数
//化简
//先求答案的分子分母的最大公约数
int maxtemp = gcd(fz, fm);
//化简分子分母
fz /= maxtemp;
fm /= maxtemp;
if (fm == 1)
cout << fz;
else
cout << fz << "/" << fm;
return 0;
}