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;
}