当前位置: 代码迷 >> 综合 >> 一本通————1209 分数求和
  详细解决方案

一本通————1209 分数求和

热度:62   发布时间:2023-12-28 05:17:58.0

1209:分数求和


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 4671     通过数: 2617

【题目描述】

输入nn 个分数并对他们求和,并用最简形式表示。所谓最简形式是指:分子分母的最大公约数为11 ;若最终结果的分母为11 ,则直接用整数表示。

如:56、10356、103 均是最简形式,而3636 需要化简为12,3112,31 需要化简为33 。

分子和分母均不为00 ,也不为负数。

【输入】

第一行是一个整数nn ,表示分数个数,1≤n≤101≤n≤10 ;

接下来nn 行,每行一个分数,用"p/qp/q "的形式表示,不含空格,p,qp,q 均不超过1010 。

【输出】

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

【输入样例】

2
1/2
1/3

【输出样例】

5/6

【来源】


No

 

 

这道题划分到了递归里面,主要是考分数在约分的时候递归求解最大公约数

#include <bits/stdc++.h>
using namespace std;int gcd(int m,int n)
{return n==0?m:gcd(n,m%n);
}void calculate(int &f,int &m,int x,int y)
{if(f==0&&m==0)    //如果是第一个分式{f=x;m=y;return;}f=f*y;    x=x*m;    //先计算通分后的分子m=m*y;    //在计算分母y=m;f=f+x;    //两个分式相加int c=gcd(f,m); f=f/c;m=m/c;return;
}int main()
{int n;string str;int len,j,x,y,f=0,m=0;    //由于第一个分母不好记录,这里设置了“flag”cin>>n;for(int i=1; i<=n; i++){x=y=j=0;cin>>str;len=str.length();while(str[j]!='/')    //对读入的式子进行划分{x=x*10+str[j]-'0';j++;}j++;    //不要忘记j+1,因为此时str[j]=='/'while(j<len){y=y*10+str[j]-'0';j++;}calculate(f,m,x,y);}if(m==1){cout<<f<<endl;}else{cout<<f<<"/"<<m<<endl;}return 0;
}