【递归】分数求和
【问题描述】输入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;
}