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

信息学奥赛一本通:1209 分数求和

热度:0   发布时间:2023-12-14 13:04:35.0
题目传送门

题目描述

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