Pat1081代码
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<cstdio>
#include<cstdlib>
using namespace std;
long int GCD(long int num,long int den)
{
long int temp;
while(den!=0)
{
temp=num%den;
num=den;
den=temp;
}
return num;
}
void GetSum(long int a,long int b,long int *num,long int *den)
{
long int ret;
long int upsum,downsum;
upsum=a*(*den)+b*(*num);
downsum=b*(*den);
ret=GCD(upsum,downsum);
(*num)=upsum/ret;
(*den)=downsum/ret;
}
int main(int argc,char *argv[])
{
int n;
long int a,b;
long int num=0,den=0;
scanf("%d",&n);
scanf("%ld/%ld",&num,&den);
for(int i=1;i<n;i++)
{
scanf("%ld/%ld",&a,&b);
GetSum(a,b,&num,&den);
}
if(num%den==0)
printf("%ld\n",num/den);
else if(num>den)
{
printf("%ld",num/den);
printf(" %ld/%ld\n",num-num/den*den,den);
}
else
printf("%ld/%ld\n",num,den);
return 0;
}