算法思想:
①numerator接收分子,denominator接收分母;每次根据分母求最小公倍数l,然后分母通分累加到sum上。遍历结束后sum是分母,l是分子。
②碾转相处法求最大公约数,分子分母一起除公约数(绝对值),然后分子分母约分输出。
#include<iostream>
using namespace std;
long long gcd(long long a, long long b)
{
return b == 0 ? a : gcd(b, a % b);//gcd(a,b) = gcd(b,a % b) 0的最大公约数就是另一个数
}
long long lcm(long long a, long long b) {//两个数的乘积等于这两个数的最大公约数与最小公倍数的积。即(a,b)×[a,b]=a×b
if (a == 0 || b == 0) {
return 0;
}
return a * b / gcd(a, b);
}
int main(){
int n;
cin>>n;
long long numerator;//接收分子
long long denominator;//接收分母
long long l=1;//最小公倍数
long long m=1;//倍数
char c;//接收‘/’除号
long long sum=0;
for(int i=0;i<n;i++){
cin>>numerator>>c>>denominator;
long long last=l;
l=lcm(l,denominator);
c=l/denominator;
sum*=(l/last);
sum+=c*numerator;
}
long long res1=sum/abs(gcd(sum,l));
long long res2=l/abs(gcd(sum,l));
if(res1/res2){
cout<<res1/res2;
if(res1-(res1/res2)*res2)
cout<<" "<<res1-(res1/res2)*res2<<"/"<<res2;
cout<<endl;
}else if(res1==0){
cout<<0<<endl;
}
else{
cout<<res1<<'/'<<res2<<endl;
}
}