#include <iostream>
using namespace std;
//辗转相除法,求a和b的最大公约数
long long int gcd(int a,int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
int main()
{
int N;
long long int a1=0,b1=1,a2,b2,maxGys;
scanf("%d",&N);
for(int i=0;i<N;i++)
{
scanf("%lld/%lld",&a2,&b2);
maxGys=gcd(a2,b2);
a2/=maxGys;
b2/=maxGys;
a1=a1*b2+a2*b1;
b1=b1*b2;
maxGys=gcd(a1,b1);
a1/=maxGys;
b1/=maxGys;
}
if(a1>b1&&b1!=1)
printf("%lld %lld/%lld",a1/b1,a1%b1,b1);
else if(a1%b1==0)
printf("%lld",a1);
else
printf("%lld/%lld",a1,b1);
}
本题主要考察辗转相除法求最大公约数,摘自网上的解释:
用到辗转相除法求最大公约数 被除数÷除数=商……余数;
如果余数是0,那么此时的被除数是最大公约数;
否则 被除数=除数;除数=余数,继续
int gcd(int b1, int b2)
{
return b2==0 ? b1 : gcd(b2, b1%b2);
}
此外只要注意每次加一个分式之前先对其进行约分,加完之后也对和进行约分即可。