N个分数求和,emmmm…几个注意点:
(1)用两个数组分别存放分子和分母,分数和采用通分。
(2)可以用变量s1记录通分后分子之和,变量s2记录分母通分后的值。
(3)问题转化为求最大公约数和最小公倍数。
(4)之后在输出时,要注意将(分子/分母)化到最简形式。
#include<iostream>
#include<cmath>
using namespace std;
long gcd(long a,long b)
{//求两数的最大公约数
return a%b==0 ? b:gcd(b,a%b);
}
int main()
{
int N;
cin>>N;
int a[100]={0};//分子
int b[100]={0};//分母
long s1=0;//s1记录所有分母通分后分子之和
long s2=0;//s2记录当前最小公倍数
for(int i=0;i<N;i++)
{
scanf("%d/%d",&a[i],&b[i]);
}
s2=b[0];//将s2当做初始最小公倍数
for(int i=1;i<N;i++)
{//求出最终最小公倍数s2
s2=s2*b[i]/gcd(s2,b[i]);
}
for(int i=0;i<N;i++)
{//求出通分后所有分子之和s1
s1+=s2/b[i]*a[i];
}
long long n=s1/s2,m=abs(s1%s2);//n存储整数m存储余数
if(m==0)
{//如果结果是整数
cout<<n<<endl;
}
else
{
if(n!=0)
{//n==0时不输出n
cout<<n<<" ";
}
if(s1<0)
{//如果是负数
cout<<"-";
}//将(分子/分母)化到最简
cout<<m/gcd(s2,m)<<"/"<<s2/gcd(s2,m);
}
return 0;
}