0
点赞
收藏
分享

微信扫一扫

1209:分数求和 c++_递归_gcd

林塬 2022-03-11 阅读 51
c++算法

【题目描述】
输入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

分析

  1. 此题求分母的和,我们可以对分子、分母分开求解,最后化简;
  2. 最终和的分母,为这些分母的最小公倍数min,所以我们定义一个求最大公约数的函数gcd,通过这些数的乘积sumb除以最大公约数max求得最小公倍数min;
  3. 可以参考:最大公约数
  4. 把通分后的分子和加起来,然后化简分子分母即可
#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;
}

举报

相关推荐

0 条评论