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/3Sample Output 1:
3 1/3Sample Input 2:
2 4/3 2/3Sample Output 2:
2Sample Input 3:
3 1/3 -1/6 1/8Sample Output 3:
7/24
//分数和,这种题目就是过程比较繁琐
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char str[30];
long long getMax(long long a, long long b)
{
long long int temp = 0;
while (b)
{
temp = b;
b = a % b;
a = temp;
}
return a;
}
void getR(char str[], int length, long long &num, long long &de, bool &flag)
{
int i = 0;
if (str[i] == '+')
{
flag = true;
++i;
}
else if (str[i] == '-')
{
flag = false;
++i;
}
else
flag = true;
num = 0;
while (i < length && str[i] != '/')
{
num = num * 10 + str[i] - '0';
++i;
}
++i;
de = 0;
while (i < length)
{
de = de * 10 + str[i] - '0';
++i;
}
long long maxC = getMax(de, num);
num /= maxC;
de /= maxC;
}
void getadd(bool &flag1, long long &a1, long long &b1, bool flag2, long long a2, long long b2)
{
long long maxCom = getMax(b1, b2);
long long minG = b1 * b2 / maxCom;
a1 *= minG / b1;
a2 *= minG / b2;
if ((flag1 && flag2) || (!flag1 && !flag2))
a1 += a2;
else
a1 -= a2;
if (a1 < 0)
{
flag1 = !flag1;
a1 = -a1;
}
b1 = minG;
maxCom = getMax(a1, b1);
a1 /= maxCom;
b1 /= maxCom;
}
int main(void)
{
int n;
long long a1, b1, a2, b2;
bool flag1, flag2;
scanf("%d", &n);
if (n > 0)
{
scanf("%s", str);
getR(str, strlen(str), a1, b1, flag1);
}
for (int i = 1; i < n; ++i)
{
scanf("%s", str);
getR(str, strlen(str), a2, b2, flag2);
getadd(flag1, a1, b1, flag2, a2, b2);
}
if (a1 == 0)
{
printf("0\n");
return 0;
}
if (!flag1)
printf("-");
if (a1 / b1 > 0)
printf("%lld", a1 / b1);
if (a1 / b1 > 0 && a1 % b1 != 0)
printf(" ");
if (a1 % b1 != 0)
{
printf("%lld/%lld", (a1 % b1), b1);
}
printf("\n");
return 0;
}