#include<iostream> #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<algorithm> #include<map> #include<vector> #include<queue> using namespace std; typedef long long ll; //记ll为long long ll gcd(ll a,ll b){ //求a与b的最大公约数 return b==0?a:gcd(b,a%b); } struct Fraction{ //分数 ll up,down; //分子,分母 }; Fraction reduction(Fraction result){ //化简 if(result.down <0) { //分母为负数,令分子和分母都变为相反数 result.up=-result.up; result.down=-result.down; } if(result.up == 0){ //如果分子为0 result.down=1; //令分母为1 }else{ //如果分子不为0,进行约分 int d=gcd(abs(result.up) , abs(result.down)); //分子分母的最大公约数 result.up /= d; //约去最大公约数 result.down /= d; } return result; } Fraction add(Fraction f1,Fraction f2){ //分数f1加上分数f2 Fraction result; result.up=f1.up*f2.down+f2.up*f1.down; //分数和的分子 result.down=f1.down *f2.down; //分数和的分母 return reduction(result); //返回结果分数,注意化简 } void showResult(Fraction r){ //输出分数r reduction(r); if(r.down == 1) printf("%lld",r.up); //整数 else if(abs(r.up) > r.down){ //假分数 printf("%lld %lld/%lld\n",r.up / r.down, abs(r.up)%r.down , r.down); }else{ //真分数 printf("%lld/%lld\n",r.up,r.down); } } int main(){ int n; //分数个数 scanf("%d",&n); //分数个数 Fraction sum,temp; sum.up=0;sum.down=1 ;//初值:和的分子为0,分母为1!!! for(int i=0;i<n;i++){ scanf("%lld/%lld",&temp.up,&temp.down); sum=add(sum,temp); //sum增加temp } showResult(sum); //输出结果 system("pause"); return 0; }