测试点3不过,后来在每一次计算后都进行化简后过。
#include <iostream>
using namespace std;
struct node
{
long long int son;
long long int dad;
};
int Gcd(long long int a,long long int b)//最大公约数
{
long long int z=b;
while (a%b != 0)
{
z = a % b;
a = b;
b = z;
}
return z;
}
void Change(long long int a, long long int b)
{
long long int x=a*b/Gcd(a, b);
}
int main()
{
int n;
cin >> n;
int i;
node x;
node sum;
sum.son = 0;
sum.dad = 1;
long long int dad = 0;
for (i = 0; i < n; i++)
{
cin >> x.son;
getchar();
cin >> x.dad;
if (x.dad < 0)
{
x.son = 0 - x.son;
x.dad = 0 - x.dad;
}
dad =sum.dad*x.dad/ Gcd(sum.dad, x.dad);
sum.son = dad / sum.dad*sum.son+ dad / x.dad*x.son;
sum.dad = dad;
//测试点3
long long int p = abs(Gcd(sum.son, sum.dad));//最小公倍数
sum.son = sum.son / p;
sum.dad = sum.dad / p;
}
long long int c=0;
if (sum.son >= sum.dad)
{
c = sum.son / sum.dad;
sum.son = sum.son - c * sum.dad;
}
int flag = 0;
if (c)
{
cout << c;
flag = 1;
}
//化简
long long p = abs(Gcd(sum.son, sum.dad));//最小公倍数
sum.son = sum.son / p;
sum.dad = sum.dad / p;
if (sum.son)
{
if (c)cout << " ";
cout << sum.son << "/" << sum.dad;
flag = 1;
}
if (flag == 0)cout << "0";
system("pause");
return 0;
}