题目传送门
题目描述
输入n个分数并对他们求和,并用最简形式表示。所谓最简形式是指:分子分母的最大公约数为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/qp/q"的形式表示。
输入样例
2
1/2
1/3
输出样例
5/6
#include<bits/stdc++.h>
using namespace std;
long long fz,fm,gys,fzgbs=1,fmgbs=1;//fz记录结果的分子,fm记录结果的分母
int i,n,a[11],b[11];//a[i]记录每个输入的分数的分子,b[i]记录每个输入的分数的分母
char h;
int j;
long long gcd(long long a,long long b){
return b==0?a:gcd(b,a%b);
}
long long gbs(int c[11]){
//求c数组中所有数字的最小公倍数 long long t2=c[1];//取第一个数字 for(j=2;j<=n;j++){
t2=(t2*c[j])/(gcd(t2,c[j]));}return t2;
}
int main(){
cin>>n;for(i=1;i<=n;i++){
cin>>a[i];cin>>h;cin>>b[i];}fmgbs=gbs(b);//分母最小公倍数为对b数组求最小公倍数 fm=fmgbs;for(i=1;i<=n;i++){
fz=fz+a[i]*fm/b[i];}if(fz%fm==0) //如果结果的分数能整除,比如1/2+1/2=1,直接输出整数 cout<<fz/fm<<endl;else{
//结果不能整除,对分子分母约分后,输出分数最简形式 cout<<fz/gcd(fz,fm)<<"/"<<fm/gcd(fz,fm)<<endl;//fz/gcd(fz,fm)对分子约分 ,fm/gcd(fz,fm)对分母约分 //比如输入2,2/6,2/6,结果为4/6,约分为2/3 } return 0;
}