【递归】分数求和

【递归】分数求和

【问题描述】输入n个分数并对他们求和,并用最简形式表示。所谓最简形式是指:分子分母的最大公约数为1/1;若最终结果的分母为1,则直接用整数表示。

如:5/6、10/3均是最简形式,而3/6需要化简为1/2,3/1需要化简为3。 分子和分母均不为0,也不为负数。

【输入形式】第一行是一个整数n,表示分数个数,1≤n≤10; 接下来n行,每行一个分数,用"p/q"的形式表示,不含空格,p,q均不超过10。

【输出形式】输出只有一行,即最终结果的最简形式。若为分数,用"p/q"的形式表示。

【样例输入】

2

1/2

1/3

【样例输出】

5/6

代码如下:

#include"iostream"
#include"iomanip"
#include"cmath"

using namespace std;


class Fraction
{
public:
	Fraction():molecular(0),denominator(1)
	{

	}
	void Assiginment(int m, int n)
	{
		molecular = m;
		denominator = n;
	}
	~Fraction()
	{

	}
	int Gcd(int m, int n)
	{
		int temp;
		if (m == 0 || n == 0)
			return 0;
		if (m < n)
		{
			temp = m;
			m = n;
			n = temp;
		}
		while (n != 0)
		{
			temp = n;
			n = m % n;
			m = temp;
		}
		return temp;
	}
	int Lcm(int m, int n)
	{
		int t;
		int gcd = Gcd(m, n);
		t = m * n / gcd;
		return t;
	}
	void Simplification()
	{
		int gcd = Gcd(denominator, molecular);
		denominator /= gcd;
		molecular /= gcd;
	}
	void add(Fraction* t,int& i,int n)
	{
		if (i < n)
		{
			if (t[i].denominator == denominator)
			{
				molecular += t[i].molecular;
				this->Simplification();
			}
			else
			{
				int lcm;
				lcm = Lcm(t[i].denominator, denominator);
				int m, n;
				m = lcm / t[i].denominator * t[i].molecular;
				n = lcm / denominator * molecular;
				denominator = lcm;
				molecular = m + n;
				this->Simplification();
			}
			i++;
			this->add(t, i, n);
		}
		else
			return;
	}
	void display()
	{
		if (denominator == 1)
		{
			cout << molecular << endl;
		}
		else
		{
			cout << molecular << "/" << denominator << endl;
		}
	}
private:
	int molecular;
	int denominator;
};


int main()
{
	int n;
	int a, b;
	char mid;
	Fraction* fra;
	cin >> n;
	fra = new Fraction[n];
	for (int i = 0; i < n; i++)
	{
		cin >> a >> mid >> b;
		fra[i].Assiginment(a, b);
	}
	Fraction sum;
	int i = 0;
	sum.add(fra,i,n);
	sum.display();
	return 0;
}
上一篇:java 基础练习 分数计算


下一篇:结对项目