题目
Given N rational numbers in the form "numerator/denominator", you are supposed to calculate their sum.
Input Specification:
Each input file contains one test case. Each case starts with a positive integer N (<=100), followed in the next line N rational numbers "a1/b1 a2/b2 ..." where all the numerators and denominators are in the range of "long int". If there is a negative number, then the sign must appear in front of the numerator.
Output Specification:
For each test case, output the sum in the simplest form "integer numerator/denominator" where "integer" is the integer part of the sum, "numerator" < "denominator", and the numerator and the denominator have no common factor. You must output only the fractional part if the integer part is 0.
Sample Input 1:
5 2/5 4/15 1/30 -2/60 8/3
Sample Output 1:
3 1/3
Sample Input 2:
2 4/3 2/3
Sample Output 2:
2
Sample Input 3:
3 1/3 -1/6 1/8
Sample Output 3:
7/24
分数求和。
不能先转成小数,必须保持分数格式计算。
直接模拟,注意和为0的特殊情况。
代码:
#include <iostream>
#include <cmath>
using namespace std;
long long com_mul(long long n1,long long n2); //求最小公倍数
long long com_factor(long long n1,long long n2); //求最大公因数
int main()
{
int n;
cin>>n;
long long a1=0,b1=1,a2,b2;
long long mul,factor; //最小公倍数,最大公因数
for(int i=0;i<n;i++)
{
cin>>a2; //输入数据
cin.get();
cin>>b2;
mul=com_mul(b1,b2); //求和
a1*=mul/b1;
a2*=mul/b2;
a1+=a2;
b1=mul;
factor=com_factor(a1,b1); //约简
a1/=factor;
b1/=factor;
if(a1==0)
b1=1;
}
if(a1==0) //输出
cout<<0;
else
{
if(a1/b1!=0)
{
cout<<a1/b1;
a1%=b1;
if(a1!=0)
cout<<" ";
}
if(a1!=0)
{
cout<<a1<<"/"<<b1;
}
}
return 0;
}
long long com_mul(long long n1,long long n2)
{
long long ans=n1*n2;
long long i=2,limit=sqrt((double)min(n1,n2))+1;
while(i<=n1&&i<=n2&&i<=limit)
{
if(n1%i==0&&n2%i==0)
{
ans/=i;
n1/=i;
n2/=i;
}
else
i++;
}
return ans;
}
long long com_factor(long long n1,long long n2)
{
long long ans=1;
long long i=2,limit=sqrt((double)min(n1,n2))+1;
while(i<=n1&&i<=n2&&i<=limit)
{
if(n1%i==0&&n2%i==0)
{
ans*=i;
n1/=i;
n2/=i;
}
else
i++;
}
return ans;
}